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 true24 (begin (set-car! cell true)25 false)))