cs: fix PLT_LINKLET_TIMES mode Racket-thread safety

This commit is contained in:
Matthew Flatt 2018-07-02 07:20:44 -06:00
parent eea40a6350
commit a2f1f11f9b

View File

@ -6,6 +6,10 @@
(define current-start-time '()) (define current-start-time '())
(define current-gc-start-time '()) (define current-gc-start-time '())
;; Beware that `performance-region` doesn't really handle escapes, and
;; Racket-level thread swaps during `performance-region` can cause
;; strange results.
(define-syntax performance-region (define-syntax performance-region
(syntax-rules () (syntax-rules ()
[(_ label e ...) (measure-performance-region label (lambda () e ...))])) [(_ label e ...) (measure-performance-region label (lambda () e ...))]))
@ -13,10 +17,12 @@
(define (measure-performance-region label thunk) (define (measure-performance-region label thunk)
(cond (cond
[measure-performance? [measure-performance?
(with-interrupts-disabled
(set! current-start-time (cons (current-process-milliseconds) current-start-time)) (set! current-start-time (cons (current-process-milliseconds) current-start-time))
(set! current-gc-start-time (cons (current-gc-milliseconds) current-gc-start-time)) (set! current-gc-start-time (cons (current-gc-milliseconds) current-gc-start-time)))
(begin0 (begin0
(thunk) (thunk)
(with-interrupts-disabled
(let ([delta (- (current-process-milliseconds) (car current-start-time))] (let ([delta (- (current-process-milliseconds) (car current-start-time))]
[gc-delta (- (current-gc-milliseconds) (car current-gc-start-time))]) [gc-delta (- (current-gc-milliseconds) (car current-gc-start-time))])
(hashtable-update! region-times label (lambda (v) (+ v delta)) 0) (hashtable-update! region-times label (lambda (v) (+ v delta)) 0)
@ -28,12 +34,13 @@
(unless (null? l) (unless (null? l)
(set-car! l (+ (car l) delta)) (set-car! l (+ (car l) delta))
(set-car! gc-l (+ (car gc-l) gc-delta)) (set-car! gc-l (+ (car gc-l) gc-delta))
(loop (cdr l) (cdr gc-l))))))] (loop (cdr l) (cdr gc-l)))))))]
[else (thunk)])) [else (thunk)]))
(define (add-performance-memory! label delta) (define (add-performance-memory! label delta)
(when measure-performance? (when measure-performance?
(hashtable-update! region-memories label (lambda (v) (+ v delta)) 0))) (with-interrupts-disabled
(hashtable-update! region-memories label (lambda (v) (+ v delta)) 0))))
(define (linklet-performance-init!) (define (linklet-performance-init!)
(hashtable-set! region-times 'boot (hashtable-set! region-times 'boot