~ chicken-core (master) ce0ce0c4f175ce05cdcae86843a1382bf7389758
commit ce0ce0c4f175ce05cdcae86843a1382bf7389758
Author: felix <felix@call-with-current-continuation.org>
AuthorDate: Mon Aug 1 12:27:09 2011 +0200
Commit: felix <felix@call-with-current-continuation.org>
CommitDate: Mon Aug 1 12:27:09 2011 +0200
profiler uses flonum ms values
diff --git a/chicken-profile.scm b/chicken-profile.scm
index e5f65c1b..257591ed 100644
--- a/chicken-profile.scm
+++ b/chicken-profile.scm
@@ -203,7 +203,6 @@ EOF
(if (< 0 top (length data))
(set! data (take data top)))
(set! data (map (lambda (entry)
- (pp entry)
(let ([c (second entry)]
[t (third entry)]
[a (fourth entry)]
diff --git a/chicken.h b/chicken.h
index 15bd9cd3..c706491e 100644
--- a/chicken.h
+++ b/chicken.h
@@ -1449,12 +1449,6 @@ extern double trunc(double);
#define C_a_i_current_milliseconds(ptr, c, dummy) C_flonum(ptr, C_milliseconds())
-/* this is of course silly, but only used for profiling, where we can assume that
- the process doesn't run for more than a week.
-
- (now someone will do exactly that ...) */
-#define C_i_current_cpu_milliseconds_as_fixnum(dummy) C_fix(C_cpu_milliseconds())
-
/* Variables: */
diff --git a/profiler.scm b/profiler.scm
index 81e4c8e2..1879b461 100644
--- a/profiler.scm
+++ b/profiler.scm
@@ -27,9 +27,8 @@
(declare
(unit profiler)
- (hide ##sys#profile-name ##sys#profile-vector-list)
- (disable-interrupts)
- (fixnum) )
+ (hide ##sys#profile-name ##sys#profile-vector-list cpu-ms)
+ (disable-interrupts))
(foreign-declare #<<EOF
#include <unistd.h>
@@ -49,71 +48,70 @@ EOF
(define ##sys#profile-name #f)
(define ##sys#profile-append-mode #f)
+
;;; Initialize profile counter vector:
(define ##sys#register-profile-info
- (let ((make-vector make-vector))
- (lambda (size filename)
- (when filename
- (set! ##sys#profile-name
- (if (string? filename)
- filename
- (string-append "PROFILE." (number->string profile-id))))
- (let ([oldeh (##sys#exit-handler)]
- [oldieh (##sys#implicit-exit-handler)] )
- (##sys#exit-handler
- (lambda args
- (##sys#finish-profile)
- (apply oldeh args) ) )
- (##sys#implicit-exit-handler
- (lambda ()
- (##sys#finish-profile)
- (oldieh) ) ) ) )
- ;; entry: [name, count, time0, total, pending]
- (let ((vec (make-vector (* size profile-info-entry-size) 0)))
- (set! ##sys#profile-vector-list (cons vec ##sys#profile-vector-list))
- vec) ) ) )
+ (lambda (size filename)
+ (when filename
+ (set! ##sys#profile-name
+ (if (string? filename)
+ filename
+ (string-append "PROFILE." (number->string profile-id))))
+ (let ([oldeh (##sys#exit-handler)]
+ [oldieh (##sys#implicit-exit-handler)] )
+ (##sys#exit-handler
+ (lambda args
+ (##sys#finish-profile)
+ (apply oldeh args) ) )
+ (##sys#implicit-exit-handler
+ (lambda ()
+ (##sys#finish-profile)
+ (oldieh) ) ) ) )
+ ;; entry: [name, count, time0, total, pending]
+ (let ((vec (make-vector (fx* size profile-info-entry-size) 0)))
+ (set! ##sys#profile-vector-list (cons vec ##sys#profile-vector-list))
+ vec) ) )
(define (##sys#set-profile-info-vector! vec i x)
- (##sys#setslot vec (* i profile-info-entry-size) x) )
+ (##sys#setslot vec (fx* i profile-info-entry-size) x) )
;;; Entry and exit into/out of profiled lambda:
+(define cpu-ms (foreign-lambda double "C_cpu_milliseconds"))
+
(define ##sys#profile-entry
- (let ((maxfix (##sys#fudge 21)))
+ (let ((maxfix most-positive-fixnum))
(lambda (index vec)
- (let* ([i (* index profile-info-entry-size)]
- [ic (add1 i)]
+ (let* ([i (fx* index profile-info-entry-size)]
+ [ic (fx+ i 1)]
[count (##sys#slot vec ic)]
- [it0 (+ i 2)]
- [ip (+ i 4)]
+ [it0 (fx+ i 2)]
+ [ip (fx+ i 4)]
[ipc (##sys#slot vec ip)] )
(##sys#setislot
vec ic
(cond ((not count) #f)
((eq? maxfix count) #f)
- (else (add1 count))))
- (when (zero? ipc)
- (##sys#setislot
- vec it0
- (##core#inline "C_i_current_cpu_milliseconds_as_fixnum" #f)))
- (##sys#setislot vec ip (add1 ipc)) ) ) ) )
+ (else (fx+ count 1))))
+ (when (eq? 0 ipc)
+ (##sys#setslot vec it0 (cpu-ms)))
+ (##sys#setislot vec ip (fx+ ipc 1)) ) ) ) )
(define (##sys#profile-exit index vec)
(let* ([i (fx* index profile-info-entry-size)]
[it0 (fx+ i 2)]
[it (fx+ i 3)]
[ip (fx+ i 4)]
- [ipc (sub1 (##sys#slot vec ip))] )
+ [ipc (fx- (##sys#slot vec ip) 1)] )
(##sys#setislot vec ip ipc)
- (when (zero? ipc)
- (##sys#setislot
- vec it
- (fx+ (##sys#slot vec it)
- (fx- (##core#inline "C_i_current_cpu_milliseconds_as_fixnum" #f)
- (##sys#slot vec it0)))))
- (##sys#setislot vec it0 0) ) )
+ (when (eq? 0 ipc)
+ (let ((t (##sys#slot vec it)))
+ (##sys#setslot
+ vec it
+ (fp+ (if (eq? t 0) 0.0 t)
+ (fp- (cpu-ms) (##sys#slot vec it0))))))))
;;; Generate profile:
@@ -124,7 +122,7 @@ EOF
[write write] )
(lambda ()
(when (##sys#fudge 13)
- (##sys#print "[debug] writing profile...\n" #f ##sys#standard-output) )
+ (##sys#print "[debug] writing profile...\n" #f ##sys#standard-error) )
(apply
with-output-to-file ##sys#profile-name
(lambda ()
Trap