seq_cst ordering in rwlock downgrade
This commit is contained in:
+5
-5
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user