From eeb73a6c058fb03d96acd514b9cd5ec147ffda1f Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Sat, 1 Feb 2020 07:14:49 -0700 Subject: [PATCH] expander: avoid keeping thread in registry lock Weakly retain the lock holder in a namespace registry. Otherwise, it can retain a thread that should have been unreachable. --- racket/src/expander/namespace/registry.rkt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/racket/src/expander/namespace/registry.rkt b/racket/src/expander/namespace/registry.rkt index 247ca8cdbe..a21585c5f3 100644 --- a/racket/src/expander/namespace/registry.rkt +++ b/racket/src/expander/namespace/registry.rkt @@ -16,9 +16,9 @@ (define v (unbox lock-box)) (cond [(or (not v) - (sync/timeout 0 (car v) (cdr v))) + (sync/timeout 0 (car v) (or (weak-box-value (cdr v) never-evt)))) (define sema (make-semaphore)) - (define lock (cons (semaphore-peek-evt sema) (current-thread))) + (define lock (cons (semaphore-peek-evt sema) (make-weak-box (current-thread)))) ((dynamic-wind void (lambda () @@ -31,10 +31,10 @@ (lambda () (loop))])) (lambda () (semaphore-post sema))))] - [(eq? (current-thread) (cdr v)) + [(eq? (current-thread) (weak-box-value (cdr v))) ;; This thread already holds the lock (proc)] [else ; Wait and try again: - (sync (car v) (cdr v)) + (sync (car v) (or (weak-box-value (cdr v)) never-evt)) (loop)])))