seq_cst ordering in rwlock downgrade

This commit is contained in:
Witold Kręcicki
2020-02-20 22:21:12 +01:00
parent 25cec1ec08
commit 130bef4013
+5 -5
View File
@@ -51,10 +51,10 @@ isc_rwlock_lock(isc_rwlock_t *rwl, isc_rwlocktype_t type) {
while (true) {
REQUIRE(pthread_rwlock_wrlock(&rwl->rwlock) == 0);
/* Unlock if in middle of downgrade operation */
if (atomic_load_acquire(&rwl->downgrade)) {
if (atomic_load_explicit(&rwl->downgrade, memory_order_seq_cst)) {
REQUIRE(pthread_rwlock_unlock(&rwl->rwlock) ==
0);
while (atomic_load_acquire(&rwl->downgrade)) {
while (atomic_load_explicit(&rwl->downgrade, memory_order_seq_cst)) {
}
continue;
}
@@ -77,7 +77,7 @@ isc_rwlock_trylock(isc_rwlock_t *rwl, isc_rwlocktype_t type) {
break;
case isc_rwlocktype_write:
ret = pthread_rwlock_trywrlock(&rwl->rwlock);
if ((ret == 0) && atomic_load_acquire(&rwl->downgrade)) {
if ((ret == 0) && atomic_load_explicit(&rwl->downgrade, memory_order_seq_cst)) {
isc_rwlock_unlock(rwl, type);
return (ISC_R_LOCKBUSY);
}
@@ -114,10 +114,10 @@ isc_rwlock_tryupgrade(isc_rwlock_t *rwl) {
void
isc_rwlock_downgrade(isc_rwlock_t *rwl) {
atomic_store_release(&rwl->downgrade, true);
atomic_store_explicit(&rwl->downgrade, true, memory_order_seq_cst);
isc_rwlock_unlock(rwl, isc_rwlocktype_write);
isc_rwlock_lock(rwl, isc_rwlocktype_read);
atomic_store_release(&rwl->downgrade, false);
atomic_store_explicit(&rwl->downgrade, false, memory_order_seq_cst);
}
void