]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Fixup the atomic code in pthread_rwlock branch of lib/isc/rwlock.c
authorOndřej Surý <ondrej@sury.org>
Tue, 4 Jun 2019 08:10:46 +0000 (10:10 +0200)
committerEvan Hunt <each@isc.org>
Wed, 5 Jun 2019 18:17:19 +0000 (11:17 -0700)
lib/isc/rwlock.c

index d756d663abc0cb63887bafa8fef10e096f7de58b..9ec64c9262d657579a8a87a8e0ef0cfd862701a1 100644 (file)
@@ -53,10 +53,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_release(&rwl->downgrade)) {
+                       if (atomic_load_acquire(&rwl->downgrade)) {
                                REQUIRE(pthread_rwlock_unlock(&rwl->rwlock)
                                        == 0);
-                               while (atomic_load(&rwl->downgrade));
+                               while (atomic_load_acquire(&rwl->downgrade));
                                continue;
                        }
                        break;
@@ -78,7 +78,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(&rwl->downgrade)) {
+               if ((ret == 0) && atomic_load_acquire(&rwl->downgrade)) {
                        isc_rwlock_unlock(rwl, type);
                        return (ISC_R_LOCKBUSY);
                }
@@ -104,15 +104,16 @@ isc_rwlock_unlock(isc_rwlock_t *rwl, isc_rwlocktype_t type) {
 
 isc_result_t
 isc_rwlock_tryupgrade(isc_rwlock_t *rwl) {
+       UNUSED(rwl);
        return (ISC_R_LOCKBUSY);
 }
 
 void
 isc_rwlock_downgrade(isc_rwlock_t *rwl) {
-       atomic_store_acquire(&rwl->downgrade, true);
+       atomic_store_release(&rwl->downgrade, true);
        isc_rwlock_unlock(rwl, isc_rwlocktype_write);
        isc_rwlock_lock(rwl, isc_rwlocktype_read);
-       atomic_store_acquire(&rwl->downgrade, false);
+       atomic_store_release(&rwl->downgrade, false);
 }
 
 void