cs: add sync shortcuts for simple cases

This commit is contained in:
Matthew Flatt 2018-08-18 14:36:25 -06:00
parent e15eadd106
commit ae4b101ec5
2 changed files with 35 additions and 5 deletions

View File

@ -12,7 +12,8 @@
channel-get
channel-put-evt
channel-put-evt?)
channel-put-evt?
channel-put-do)
(module+ for-sync
(provide set-sync-on-channel!))
@ -194,6 +195,10 @@
(define new-v ((cdr ch+put-proc) old-ch v))
(channel-put old-ch new-v))
(define (channel-put-do v)
(channel-put (channel-put-evt*-ch v)
(channel-put-evt*-v v)))
;; ----------------------------------------
(define (not-matching-select-waiter w+b/v)

View File

@ -166,11 +166,36 @@
;; Just `go`:
(go)])))
(define (sync . args)
(do-sync 'sync #f args))
(define sync
(case-lambda
[(evt)
(cond
[(semaphore? evt)
(semaphore-wait evt)
evt]
[(channel? evt)
(channel-get evt)]
[(channel-put-evt? evt)
(channel-put-do evt)
evt]
[else
(do-sync 'sync #f (list evt))])]
[args
(do-sync 'sync #f args)]))
(define (sync/timeout timeout . args)
(do-sync 'sync/timeout timeout args))
(define sync/timeout
(case-lambda
[(timeout evt)
(cond
[(and (semaphore? evt)
(eqv? timeout 0))
(if (semaphore-try-wait? evt)
evt
#f)]
[else
(do-sync 'sync/timeout timeout (list evt))])]
[(timeout . args)
(do-sync 'sync/timeout timeout args)]))
(define (sync/enable-break . args)
(do-sync 'sync/enable-break #f args #:enable-break? #t))