parent
94b257df3c
commit
d413d8cfa9
|
|
@ -115,7 +115,10 @@ static morder ConvertOrder(morder mo) {
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T> T func_xchg(volatile T *v, T op) {
|
template<typename T> T func_xchg(volatile T *v, T op) {
|
||||||
return __sync_lock_test_and_set(v, op);
|
T res = __sync_lock_test_and_set(v, op);
|
||||||
|
// __sync_lock_test_and_set does not contain full barrier.
|
||||||
|
__sync_synchronize();
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T> T func_add(volatile T *v, T op) {
|
template<typename T> T func_add(volatile T *v, T op) {
|
||||||
|
|
@ -255,6 +258,9 @@ static void AtomicStore(ThreadState *thr, uptr pc, volatile T *a, T v,
|
||||||
thr->clock.ReleaseStore(&s->clock);
|
thr->clock.ReleaseStore(&s->clock);
|
||||||
*a = v;
|
*a = v;
|
||||||
s->mtx.Unlock();
|
s->mtx.Unlock();
|
||||||
|
// Trainling memory barrier to provide sequential consistency
|
||||||
|
// for Dekker-like store-load synchronization.
|
||||||
|
__sync_synchronize();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T, T (*F)(volatile T *v, T op)>
|
template<typename T, T (*F)(volatile T *v, T op)>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue