diff --git a/typed-racket-doc/typed-racket/scribblings/reference/types.scrbl b/typed-racket-doc/typed-racket/scribblings/reference/types.scrbl index 2a3896e8..e5243921 100644 --- a/typed-racket-doc/typed-racket/scribblings/reference/types.scrbl +++ b/typed-racket-doc/typed-racket/scribblings/reference/types.scrbl @@ -261,6 +261,7 @@ These are not part of the numeric tower. @defidform[Place] @defidform[Place-Channel] @defidform[Semaphore] +@defidform[FSemaphore] @defidform[Will-Executor] @defidform[Pseudo-Random-Generator] )]{ diff --git a/typed-racket-lib/typed-racket/base-env/base-env.rkt b/typed-racket-lib/typed-racket/base-env/base-env.rkt index f8de6bd8..be1082b7 100644 --- a/typed-racket-lib/typed-racket/base-env/base-env.rkt +++ b/typed-racket-lib/typed-racket/base-env/base-env.rkt @@ -1436,6 +1436,14 @@ [would-be-future (-poly (A) ((-> A) . -> . (-future A)))] [processor-count (-> -PosInt)] +;; Section 11.4.2 (Future Semaphores) +[make-fsemaphore (-> -Nat -FSemaphore)] +[fsemaphore? (make-pred-ty -FSemaphore)] +[fsemaphore-post (-> -FSemaphore -Void)] +[fsemaphore-wait (-> -FSemaphore -Void)] +[fsemaphore-try-wait? (-> -FSemaphore B)] +[fsemaphore-count (-> -FSemaphore -Nat)] + ;; Section 11.5 (Places) [place-enabled? (-> -Boolean)] [place? (make-pred-ty -Place)] diff --git a/typed-racket-lib/typed-racket/base-env/base-types.rkt b/typed-racket-lib/typed-racket/base-env/base-types.rkt index ff389c9a..1f02b2c6 100644 --- a/typed-racket-lib/typed-racket/base-env/base-types.rkt +++ b/typed-racket-lib/typed-racket/base-env/base-types.rkt @@ -149,6 +149,7 @@ [Thread-Group -Thread-Group] [Impersonator-Property -Impersonator-Property] [Semaphore -Semaphore] +[FSemaphore -FSemaphore] [Bytes-Converter -Bytes-Converter] [Pseudo-Random-Generator -Pseudo-Random-Generator] [Logger -Logger] diff --git a/typed-racket-lib/typed-racket/types/abbrev.rkt b/typed-racket-lib/typed-racket/types/abbrev.rkt index 87fd3bb8..f50eb07c 100644 --- a/typed-racket-lib/typed-racket/types/abbrev.rkt +++ b/typed-racket-lib/typed-racket/types/abbrev.rkt @@ -32,6 +32,7 @@ (only-in racket/flonum flvector?) (only-in racket/extflonum extflvector?) (only-in racket/fixnum fxvector?) + (only-in racket/future fsemaphore?) (only-in '#%place place? place-channel?)) (only-in racket/pretty pretty-print-style-table?) (only-in racket/udp udp?) @@ -39,6 +40,7 @@ (only-in racket/flonum flvector?) (only-in racket/extflonum extflvector?) (only-in racket/fixnum fxvector?) + (only-in racket/future fsemaphore?) (only-in '#%place place? place-channel?)) (provide (except-out (all-defined-out) make-Base) @@ -222,6 +224,7 @@ (define/decl -Impersonator-Property (make-Base 'Impersonator-Property #'impersonator-property? impersonator-property?)) (define/decl -Semaphore (make-Base 'Semaphore #'semaphore? semaphore?)) +(define/decl -FSemaphore (make-Base 'FSemaphore #'fsemaphore? fsemaphore?)) (define/decl -Bytes-Converter (make-Base 'Bytes-Converter #'bytes-converter? bytes-converter?)) (define/decl -Pseudo-Random-Generator (make-Base 'Pseudo-Random-Generator #'pseudo-random-generator? pseudo-random-generator?)) diff --git a/typed-racket-test/unit-tests/typecheck-tests.rkt b/typed-racket-test/unit-tests/typecheck-tests.rkt index 2ad9ba71..497cd8a2 100644 --- a/typed-racket-test/unit-tests/typecheck-tests.rkt +++ b/typed-racket-test/unit-tests/typecheck-tests.rkt @@ -1855,6 +1855,13 @@ 'not-a-failure-thunk "x")] + ;; Future Semaphores + [tc-e (make-fsemaphore 5) -FSemaphore] + [tc-e (fsemaphore-count (make-fsemaphore 5)) -Nat] + [tc-e (let: ((s : FSemaphore (make-fsemaphore 3))) + (fsemaphore-post s)) + -Void] + ;Random Numbers (tc-e (make-pseudo-random-generator) -Pseudo-Random-Generator) (tc-e (let: ((pg : Pseudo-Random-Generator (make-pseudo-random-generator)))