From 64b834c9c055dae7d9a0e03673bfbef94bbb75fd Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Sat, 22 May 2021 18:11:14 -0600 Subject: [PATCH] cs: fix call-in-os-thread to not retain the current Racket thread Closes #3843 --- pkgs/racket-test/tests/racket/os-thread.rkt | 30 +++++++++++++++++++++ racket/src/cs/schemified/thread.scm | 6 ++++- racket/src/thread/os-thread.rkt | 4 ++- 3 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 pkgs/racket-test/tests/racket/os-thread.rkt diff --git a/pkgs/racket-test/tests/racket/os-thread.rkt b/pkgs/racket-test/tests/racket/os-thread.rkt new file mode 100644 index 0000000000..0a0aa1d925 --- /dev/null +++ b/pkgs/racket-test/tests/racket/os-thread.rkt @@ -0,0 +1,30 @@ +#lang racket/base +(require ffi/unsafe + ffi/unsafe/os-thread + ffi/unsafe/os-async-channel) + +(when (os-thread-enabled?) + (define ch1 (make-os-async-channel)) + (define ch2 (make-os-async-channel)) + + (define wb + (make-weak-box + (thread (lambda () + (call-in-os-thread + (lambda () + (os-async-channel-put ch1 'ready) + (os-async-channel-get ch2))) + (sync never-evt))))) + + (sync (system-idle-evt)) + (os-async-channel-get ch1) + + (collect-garbage) + + (when (weak-box-value wb) + (error "thread was retained")) + + (os-async-channel-put ch2 'done) + + 'success) + diff --git a/racket/src/cs/schemified/thread.scm b/racket/src/cs/schemified/thread.scm index 6bf012b615..231d3e32b1 100644 --- a/racket/src/cs/schemified/thread.scm +++ b/racket/src/cs/schemified/thread.scm @@ -15049,7 +15049,11 @@ (if threaded? (void) (raise-unsupported 'unsafe-call-in-os-thread)) (|#%app| fork-pthread - (lambda () (begin (start-atomic) (|#%app| proc_0)))) + (lambda () + (begin + (start-atomic) + (current-thread/in-atomic #f) + (|#%app| proc_0)))) (void)))))) (define finish_2628 (make-struct-type-install-properties diff --git a/racket/src/thread/os-thread.rkt b/racket/src/thread/os-thread.rkt index 5cd604e8fc..31ff2aa135 100644 --- a/racket/src/thread/os-thread.rkt +++ b/racket/src/thread/os-thread.rkt @@ -1,7 +1,8 @@ #lang racket/base (require "check.rkt" "host.rkt" - "atomic.rkt") + "atomic.rkt" + "parameter.rkt") (provide unsafe-os-thread-enabled? unsafe-call-in-os-thread @@ -17,6 +18,7 @@ (unless threaded? (raise-unsupported who)) (fork-pthread (lambda () (start-atomic) ; just in case + (current-thread/in-atomic #f) ; don't inherit (proc))) (void))