diff options
Diffstat (limited to 'src/backend/port/atomics.c')
-rw-r--r-- | src/backend/port/atomics.c | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/src/backend/port/atomics.c b/src/backend/port/atomics.c index c0c2b312703..099858723f1 100644 --- a/src/backend/port/atomics.c +++ b/src/backend/port/atomics.c @@ -68,18 +68,35 @@ pg_atomic_init_flag_impl(volatile pg_atomic_flag *ptr) #else SpinLockInit((slock_t *) &ptr->sema); #endif + + ptr->value = false; } bool pg_atomic_test_set_flag_impl(volatile pg_atomic_flag *ptr) { - return TAS((slock_t *) &ptr->sema); + uint32 oldval; + + SpinLockAcquire((slock_t *) &ptr->sema); + oldval = ptr->value; + ptr->value = true; + SpinLockRelease((slock_t *) &ptr->sema); + + return oldval == 0; } void pg_atomic_clear_flag_impl(volatile pg_atomic_flag *ptr) { - S_UNLOCK((slock_t *) &ptr->sema); + SpinLockAcquire((slock_t *) &ptr->sema); + ptr->value = false; + SpinLockRelease((slock_t *) &ptr->sema); +} + +bool +pg_atomic_unlocked_test_flag_impl(volatile pg_atomic_flag *ptr) +{ + return ptr->value == 0; } #endif /* PG_HAVE_ATOMIC_FLAG_SIMULATION */ |