Blob


1 (define (make-serializer)
2 (let ((mutex (make-mutex)))
3 (lambda (p)
4 (define (serialized-p . args)
5 (mutex 'acqure)
6 (let ((val (apply p args)))
7 (mutex 'release)
8 val))
9 serialized-p)))
11 (define (make-mutex)
12 (let ((cell (list false)))
13 (define (the-mutex m)
14 (cond ((eq? m 'acquire)
15 (if (test-and-set! cell)
16 (the-mutex 'acquire)))
17 ((eq? m 'release) (clear! cell))))
18 the-mutex))
19 (define (clear! cell)
20 (set-car! cell false))
21 (define (test-and-set! cell)
22 (if (car cell)
23 true
24 (begin (set-car! cell true)
25 false)))