11 lines
364 B
Racket
11 lines
364 B
Racket
(define-syntax-rule (define/atomic (name arg ...) E ...)
|
|
(define name
|
|
(let ([sema (make-semaphore 1)])
|
|
(lambda (arg ...)
|
|
(dynamic-wind (λ() (semaphore-wait sema))
|
|
(λ() E ...)
|
|
(λ() (semaphore-post sema)))))))
|
|
;; this does the same as the above now:
|
|
(define/atomic (foo x)
|
|
(... do something ...))
|