|
60 | 60 | atomic-pair-compare-and-swap!
|
61 | 61 | atomic-fence)
|
62 | 62 | (import (rnrs)
|
63 |
| - (rename (sagittarius atomic) |
64 |
| - (memory-order? a:memory-order?))) |
| 63 | + (except (sagittarius atomic) memory-order?) |
| 64 | + (srfi :18 multithreading)) |
| 65 | +(define *lock* (make-mutex)) |
| 66 | +(define-syntax lock-guard |
| 67 | + (syntax-rules () |
| 68 | + ((_ expr ...) |
| 69 | + (dynamic-wind |
| 70 | + (lambda () |
| 71 | + (guard (c ((abandoned-mutex-exception? c) #f)) |
| 72 | + (mutex-lock! *lock*))) |
| 73 | + (lambda () expr ...) |
| 74 | + (lambda () (mutex-unlock! *lock*)))))) |
| 75 | + |
65 | 76 | ;; memory order
|
66 | 77 | (define-enumeration memory-order
|
67 | 78 | (relaxed acquire release acquire-release sequentially-consistent)
|
|
75 | 86 | (define (atomic-flag? a) (and (atomic? a) (boolean? (atomic-load a))))
|
76 | 87 | (define (atomic-flag-test-and-set! (atomic atomic-flag?)
|
77 | 88 | :optional (order *default-order*))
|
78 |
| - (atomic-exchange! atomic #t (memory-order->value order))) |
| 89 | + (define morder (memory-order->value order)) |
| 90 | + (atomic-exchange! atomic #t morder)) |
79 | 91 | (define (atomic-flag-clear! (atomic atomic-flag?)
|
80 | 92 | :optional (order *default-order*))
|
81 | 93 | (atomic-exchange! atomic #f (memory-order->value order)))
|
|
94 | 106 | (atomic-exchange! box obj (memory-order->value order)))
|
95 | 107 | (define (atomic-box-compare-and-swap! (box atomic-box?) old new
|
96 | 108 | :optional (order *default-order*))
|
97 |
| - (if (atomic-compare-and-swap! box old new (memory-order->value order)) |
98 |
| - old |
99 |
| - (atomic-box-ref box order))) |
| 109 | + (lock-guard |
| 110 | + (let ((r (atomic-box-ref box order))) |
| 111 | + (atomic-compare-and-swap! box old new (memory-order->value order)) |
| 112 | + r))) |
100 | 113 |
|
101 | 114 | ;; atomic fixnum
|
102 | 115 | (define (make-atomic-fxbox (fx fixnum?)) (make-atomic-fixnum fx))
|
|
113 | 126 | (define (atomic-fxbox-compare-and-swap! (afx atomic-fxbox?)
|
114 | 127 | (old fixnum?) (new fixnum?)
|
115 | 128 | :optional (order *default-order*))
|
116 |
| - (if (atomic-compare-and-swap! afx old new (memory-order->value order)) |
117 |
| - old |
118 |
| - (atomic-fxbox-ref afx order))) |
| 129 | + (lock-guard |
| 130 | + (let ((r (atomic-fxbox-ref afx order))) |
| 131 | + (atomic-compare-and-swap! afx old new (memory-order->value order)) |
| 132 | + r))) |
119 | 133 | (define (atomic-fxbox+/fetch! (afx atomic-fxbox?) (fx fixnum?)
|
120 | 134 | :optional (order *default-order*))
|
121 | 135 | (atomic-fixnum-add! afx fx (memory-order->value order)))
|
|
148 | 162 | (define (atomic-pair-compare-and-swap! (ap atomic-pair?) oa od na nd
|
149 | 163 | :optional (order *default-order*))
|
150 | 164 | (define morder (memory-order->value order))
|
151 |
| - (if (atomic-compare-and-swap! ap (cons oa od) (cons na nd) morder) |
152 |
| - (values oa od) |
153 |
| - (atomic-pair-ref ap order))) |
| 165 | + (lock-guard |
| 166 | + (let-values (((ra rd) (atomic-pair-ref ap order))) |
| 167 | + (atomic-compare-and-swap! ap (cons oa od) (cons na nd) morder) |
| 168 | + (values ra rd)))) |
154 | 169 |
|
155 | 170 | (define (atomic-fence (order memory-order?))
|
156 | 171 | (atomic-thread-fence (memory-order->value order)))
|
|
0 commit comments