Skip to content

Commit 5fdb55f

Browse files
committed
Adding globacl lock to SRFI-230 to make it work...
1 parent e5a590c commit 5fdb55f

File tree

1 file changed

+27
-12
lines changed

1 file changed

+27
-12
lines changed

sitelib/srfi/%3a230/atomic.scm

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,19 @@
6060
atomic-pair-compare-and-swap!
6161
atomic-fence)
6262
(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+
6576
;; memory order
6677
(define-enumeration memory-order
6778
(relaxed acquire release acquire-release sequentially-consistent)
@@ -75,7 +86,8 @@
7586
(define (atomic-flag? a) (and (atomic? a) (boolean? (atomic-load a))))
7687
(define (atomic-flag-test-and-set! (atomic atomic-flag?)
7788
: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))
7991
(define (atomic-flag-clear! (atomic atomic-flag?)
8092
:optional (order *default-order*))
8193
(atomic-exchange! atomic #f (memory-order->value order)))
@@ -94,9 +106,10 @@
94106
(atomic-exchange! box obj (memory-order->value order)))
95107
(define (atomic-box-compare-and-swap! (box atomic-box?) old new
96108
: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)))
100113

101114
;; atomic fixnum
102115
(define (make-atomic-fxbox (fx fixnum?)) (make-atomic-fixnum fx))
@@ -113,9 +126,10 @@
113126
(define (atomic-fxbox-compare-and-swap! (afx atomic-fxbox?)
114127
(old fixnum?) (new fixnum?)
115128
: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)))
119133
(define (atomic-fxbox+/fetch! (afx atomic-fxbox?) (fx fixnum?)
120134
:optional (order *default-order*))
121135
(atomic-fixnum-add! afx fx (memory-order->value order)))
@@ -148,9 +162,10 @@
148162
(define (atomic-pair-compare-and-swap! (ap atomic-pair?) oa od na nd
149163
:optional (order *default-order*))
150164
(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))))
154169

155170
(define (atomic-fence (order memory-order?))
156171
(atomic-thread-fence (memory-order->value order)))

0 commit comments

Comments
 (0)