3 ;; semaphore implementation using mutex
5 (let ([cell (mcons #f '())])
7 (cond [(eq? m 'acquire)
8 (when (test-and-set! cell)
9 (the-mutex 'acquire))] ;; loop till we acquire the mutex
10 [(eq? m 'release) (clear! cell)]))
16 (define (test-and-set! cell)
19 (begin (set-mcar! cell #t)
22 ;; semaphore implementation
23 (define (make-semaphore n)
26 (define (the-semaphore s)
27 (cond [(eq? s 'acquire)
32 (the-semaphore 'acquire))
34 (set! cell (+ cell 1))
39 (set! cell (- cell 1)))
43 ;; using test-and-set!
44 (define (make-semaphore n)
47 (define (the-semaphore s)
48 (cond [(eq? s 'acquire)
49 (if (test-and-set! flag)
50 (the-semaphore 'acquire))
54 (the-semaphore 'acquire))
56 (set! cell (+ cell 1))
59 (if (test-and-set! flag)
60 (the-semaphore 'acquire))
62 (set! cell (- cell 1)))