Fixed the ``bytes allocated off by n problem''.

This commit is contained in:
Abdulaziz Ghuloum 2008-01-07 21:37:41 -05:00
parent 01d0669607
commit fbebc96bfa
4 changed files with 27 additions and 41 deletions

Binary file not shown.

View File

@ -26,17 +26,18 @@
gc-user-secs gc-user-usecs gc-user-secs gc-user-usecs
gc-sys-secs gc-sys-usecs gc-sys-secs gc-sys-usecs
gc-real-secs gc-real-usecs gc-real-secs gc-real-usecs
bytes-minor bytes-major
)) ))
(define (mk-stats) (define (mk-stats)
(make-stats #f #f #f #f #f #f #f #f #f #f #f #f #f)) (make-stats #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f))
(define verbose-timer (make-parameter #f)) (define verbose-timer (make-parameter #f))
(define (set-stats! t) (define (set-stats! t)
(foreign-call "ikrt_stats_now" t)) (foreign-call "ikrt_stats_now" t))
(define (print-stats message bytes t1 t0) (define (print-stats message t1 t0)
(define (print-time msg msecs gc-msecs) (define (print-time msg msecs gc-msecs)
(fprintf (fprintf
(console-error-port) (console-error-port)
@ -78,7 +79,12 @@
(stats-sys-usecs t1) (stats-sys-usecs t0)) (stats-sys-usecs t1) (stats-sys-usecs t0))
(msecs (stats-gc-sys-secs t1) (stats-gc-sys-secs t0) (msecs (stats-gc-sys-secs t1) (stats-gc-sys-secs t0)
(stats-gc-sys-usecs t1) (stats-gc-sys-usecs t0)))) (stats-gc-sys-usecs t1) (stats-gc-sys-usecs t0))))
(fprintf (console-error-port) " ~a bytes allocated\n" bytes)) (fprintf (console-error-port) " ~a bytes allocated\n"
(diff-bytes
(stats-bytes-minor t0)
(stats-bytes-major t0)
(stats-bytes-minor t1)
(stats-bytes-major t1))))
(define time-it (define time-it
(case-lambda (case-lambda
@ -88,31 +94,20 @@
(unless (procedure? proc) (unless (procedure? proc)
(die 'time-it "not a procedure" proc)) (die 'time-it "not a procedure" proc))
(let* ([t0 (mk-stats)] (let* ([t0 (mk-stats)]
[t1 (mk-stats)] [t1 (mk-stats)])
[bytes-min (bytes-minor)] (define k
[bytes-maj (bytes-major)])
(set-stats! t0)
(call-with-values proc
(case-lambda (case-lambda
[(v) [(v)
(set-stats! t1) (set-stats! t1)
(print-stats message (print-stats message t1 t0)
(diff-bytes bytes-min bytes-maj
(bytes-minor) (bytes-major))
t1 t0)
v] v]
[v* [v*
(set-stats! t1) (set-stats! t1)
(print-stats message (print-stats message t1 t0)
(diff-bytes bytes-min bytes-maj (apply values v*)]))
(bytes-minor) (bytes-major)) (set-stats! t0)
t1 t0) (call-with-values proc k))]))
(apply values v*)])))]))
(define (bytes-minor)
(foreign-call "ikrt_bytes_allocated"))
(define (bytes-major)
(foreign-call "ikrt_bytes_allocated_major"))
(define (diff-bytes mnr0 mjr0 mnr1 mjr1) (define (diff-bytes mnr0 mjr0 mnr1 mjr1)
(+ (fx- mnr1 mnr0) (* (fx- mjr1 mjr0) #x10000000))) (+ (fx- mnr1 mnr0) (* (fx- mjr1 mjr0) #x10000000)))

View File

@ -1 +1 @@
1332 1333

View File

@ -839,6 +839,15 @@ ikrt_stats_now(ikptr t, ikpcb* pcb){
ref(t, off_record_data + 10 * wordsize) = fix(pcb->collect_stime.tv_usec); ref(t, off_record_data + 10 * wordsize) = fix(pcb->collect_stime.tv_usec);
ref(t, off_record_data + 11 * wordsize) = fix(pcb->collect_rtime.tv_sec); ref(t, off_record_data + 11 * wordsize) = fix(pcb->collect_rtime.tv_sec);
ref(t, off_record_data + 12 * wordsize) = fix(pcb->collect_rtime.tv_usec); ref(t, off_record_data + 12 * wordsize) = fix(pcb->collect_rtime.tv_usec);
{
/* minor bytes */
long int bytes_in_heap = ((long int) pcb->allocation_pointer) -
((long int) pcb->heap_base);
long int bytes = bytes_in_heap + pcb->allocation_count_minor;
ref(t, off_record_data + 13 * wordsize) = fix(bytes);
}
/* major bytes */
ref(t, off_record_data + 14 * wordsize) = fix(pcb->allocation_count_major);
return void_object; return void_object;
} }
@ -868,24 +877,6 @@ ikrt_gmt_offset(ikptr t){
*/ */
} }
ikptr
ikrt_bytes_allocated(ikpcb* pcb){
int bytes_in_heap = ((long int) pcb->allocation_pointer) -
((long int) pcb->heap_base);
int bytes = bytes_in_heap + pcb->allocation_count_minor;
return fix(bytes);
}
ikptr
ikrt_bytes_allocated_major(ikpcb* pcb){
return fix(pcb->allocation_count_major);
}
ikptr ikptr
ikrt_fork(){ ikrt_fork(){
int pid = fork(); int pid = fork();