From 7a12b4ac9335f6a78f14548bd0debd6a1099b771 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Sat, 7 Nov 2020 17:35:30 -0700 Subject: [PATCH] cs & thread: repair suspending a thread that is currently in `sleep` Thanks to Greg Rosenblatt for the report. --- pkgs/racket-test-core/tests/racket/thread.rktl | 11 +++++++++++ racket/src/cs/schemified/thread.scm | 2 +- racket/src/thread/thread.rkt | 1 + 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/pkgs/racket-test-core/tests/racket/thread.rktl b/pkgs/racket-test-core/tests/racket/thread.rktl index 12ba548435..452cffa994 100644 --- a/pkgs/racket-test-core/tests/racket/thread.rktl +++ b/pkgs/racket-test-core/tests/racket/thread.rktl @@ -1013,6 +1013,17 @@ (goes (lambda () (sync (system-idle-evt))) (lambda () (sync (system-idle-evt))) kill-thread))) (list sleep void)) +;; Suspend and sleep +(when (run-unreliable-tests? 'timing) + (let ([done? #f]) + (define t (thread (lambda () + (sleep 0.1) + (set! done? #t)))) + (sync (system-idle-evt)) + (thread-suspend t) + (sleep 0.1) + (test #f 'suspended-while-sleeping done?))) + ;; ---------------------------------------- ;; Simple multi-custodian threads diff --git a/racket/src/cs/schemified/thread.scm b/racket/src/cs/schemified/thread.scm index 9bdb72fd2c..afdbc18f5f 100644 --- a/racket/src/cs/schemified/thread.scm +++ b/racket/src/cs/schemified/thread.scm @@ -7663,7 +7663,7 @@ (void))))))) (if (not (thread-descheduled? t_0)) (do-thread-deschedule! t_0 #f) - void))))) + (begin (remove-from-sleeping-threads! t_0) void)))))) (define 1/thread-resume (let ((thread-resume_0 (|#%name| diff --git a/racket/src/thread/thread.rkt b/racket/src/thread/thread.rkt index 8020530b4d..22697b0e65 100644 --- a/racket/src/thread/thread.rkt +++ b/racket/src/thread/thread.rkt @@ -512,6 +512,7 @@ [(not (thread-descheduled? t)) (do-thread-deschedule! t #f)] [else + (remove-from-sleeping-threads! t) void])])) (define/who (thread-resume t [benefactor #f])