From 6db1bdda1ba79bd97aed783957068cc069c5a98a Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Mon, 9 Dec 2019 06:24:11 -0700 Subject: [PATCH] cs: fix `touch` on a future blocked on a fsemaphore Relevant to #2957 --- pkgs/racket-test/tests/future/fsemaphore.rkt | 18 ++++++++++++++++++ racket/src/thread/future-object.rkt | 2 +- racket/src/thread/future.rkt | 2 +- 3 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 pkgs/racket-test/tests/future/fsemaphore.rkt diff --git a/pkgs/racket-test/tests/future/fsemaphore.rkt b/pkgs/racket-test/tests/future/fsemaphore.rkt new file mode 100644 index 0000000000..8fb3ea8f07 --- /dev/null +++ b/pkgs/racket-test/tests/future/fsemaphore.rkt @@ -0,0 +1,18 @@ +#lang racket + +;; Check `touch` on a future blocked on an fsemaphore + +(define mutex (make-fsemaphore 1)) + +(define futures + (for/list ([i 10]) + (future + (lambda () + (fsemaphore-wait mutex) + (println (add1 i)) + (fsemaphore-post mutex))))) + +(void + (map sync + (for/list ([f (in-list futures)]) + (thread (lambda () (touch f)))))) diff --git a/racket/src/thread/future-object.rkt b/racket/src/thread/future-object.rkt index e309ee4e51..40536a7808 100644 --- a/racket/src/thread/future-object.rkt +++ b/racket/src/thread/future-object.rkt @@ -17,7 +17,7 @@ [prev #:mutable] ; queue previous [next #:mutable] ; queue next [results #:mutable] - [state #:mutable] ; #f (could run), 'running, 'blocked, 'done, 'aborted, 'fsema, or future waiting on + [state #:mutable] ; #f (could run), 'running, 'blocked, 'done, 'aborted, 'fsema or box, or future waiting on [dependents #:mutable]) ; futures that are blocked on this one #:authentic #:reflection-name 'future) diff --git a/racket/src/thread/future.rkt b/racket/src/thread/future.rkt index 0ca527d7e3..9439eeb75c 100644 --- a/racket/src/thread/future.rkt +++ b/racket/src/thread/future.rkt @@ -287,7 +287,7 @@ (lock-release (future*-lock f)) (touch s) (touch f)])] - [(box? s) ; => dependent on fsemaphore + [(or (box? s) (eq? s 'fsema)) ; => dependent on fsemaphore (cond [(current-future) ;; Lots to wait on, so give up on the current future for now