@@ -136,18 +136,19 @@ extern pthread_mutexattr_t _fastlock_attr;
136
136
# define QTHREAD_TRYLOCK_INIT (x ) { (x).u = 0; }
137
137
# define QTHREAD_TRYLOCK_INIT_PTR (x ) { (x)->u = 0; }
138
138
# define QTHREAD_TRYLOCK_LOCK (x ) { uint32_t val = qthread_incr(&(x)->s.users, 1); \
139
- while (val != (x)->s.ticket) SPINLOCK_BODY(); \
140
- THREAD_FENCE_MEM_ACQUIRE; /* spin waiting for my turn */ }
139
+ while (val != atomic_load_explicit((_Atomic uint32_t *)&(x)->s.ticket, memory_order_acquire)) SPINLOCK_BODY();}
141
140
# define QTHREAD_TRYLOCK_UNLOCK (x ) do { COMPILER_FENCE; \
142
- THREAD_FENCE_MEM_RELEASE; \
141
+ THREAD_FENCE_MEM_RELEASE; \
143
142
qthread_incr(&(x)->s.ticket, 1); /* allow next guy's turn */ \
144
143
} while (0 )
145
144
# define QTHREAD_TRYLOCK_DESTROY (x )
146
145
# define QTHREAD_TRYLOCK_DESTROY_PTR (x )
147
146
148
147
static inline int QTHREAD_TRYLOCK_TRY (qt_spin_trylock_t * x )
149
148
{
150
- qt_spin_trylock_t newcmp , cmp = * (x );
149
+ qt_spin_trylock_t newcmp , cmp ;
150
+ uint64_t tmp = atomic_load_explicit ((_Atomic uint64_t * )x , memory_order_relaxed );
151
+ cmp = * (qt_spin_trylock_t * )& tmp ;
151
152
152
153
if (cmp .s .users != cmp .s .ticket ) {
153
154
return 0 ;
@@ -157,7 +158,6 @@ static inline int QTHREAD_TRYLOCK_TRY(qt_spin_trylock_t *x)
157
158
newcmp .s .users = newcmp .s .ticket + 1 ;
158
159
159
160
if (qthread_cas (& (x -> u ), cmp .u , newcmp .u ) == cmp .u ) {
160
- THREAD_FENCE_MEM_ACQUIRE ;
161
161
return 1 ;
162
162
}
163
163
return 0 ;
0 commit comments