]> git.seodisparate.com - UDPConnection/commitdiff
Don't fail on "try" fns if failed to get spinLock
authorStephen Seo <seo.disparate@gmail.com>
Thu, 19 Oct 2023 12:07:08 +0000 (21:07 +0900)
committerStephen Seo <seo.disparate@gmail.com>
Fri, 12 Jan 2024 04:32:05 +0000 (13:32 +0900)
In SharedSpinLock: Only fail on "try" fns after spinLock was acquired
and condition is not met.

src/CXX11_shared_spin_lock.cpp

index a3cea8ed79cb67835dad9eb75fbb26134b9d32ad..ced00dcde95e314b872b65ea67f872808f46d2f1 100644 (file)
@@ -40,14 +40,18 @@ UDPC::LockObj<false> UDPC::SharedSpinLock::spin_read_lock() {
 }
 
 UDPC::LockObj<false> UDPC::SharedSpinLock::try_spin_read_lock() {
-    bool expected = false;
-    if (spinLock.compare_exchange_weak(expected, true, std::memory_order_acquire, std::memory_order_relaxed)) {
-        if (!write) {
-            ++read;
-            spinLock.store(false, std::memory_order_release);
-            return LockObj<false>(selfWeakPtr, Badge{});
-        } else {
-            spinLock.store(false, std::memory_order_release);
+    bool expected;
+    while (true) {
+        expected = false;
+        if (spinLock.compare_exchange_weak(expected, true, std::memory_order_acquire, std::memory_order_relaxed)) {
+            if (!write) {
+                ++read;
+                spinLock.store(false, std::memory_order_release);
+                return LockObj<false>(selfWeakPtr, Badge{});
+            } else {
+                spinLock.store(false, std::memory_order_release);
+                break;
+            }
         }
     }
     return LockObj<false>{};
@@ -87,14 +91,18 @@ UDPC::LockObj<true> UDPC::SharedSpinLock::spin_write_lock() {
 }
 
 UDPC::LockObj<true> UDPC::SharedSpinLock::try_spin_write_lock() {
-    bool expected = false;
-    if (spinLock.compare_exchange_weak(expected, true, std::memory_order_acquire, std::memory_order_relaxed)) {
-        if (!write && read == 0) {
-            write = true;
-            spinLock.store(false, std::memory_order_release);
-            return LockObj<true>(selfWeakPtr, Badge{});
-        } else {
-            spinLock.store(false, std::memory_order_release);
+    bool expected;
+    while (true) {
+        expected = false;
+        if (spinLock.compare_exchange_weak(expected, true, std::memory_order_acquire, std::memory_order_relaxed)) {
+            if (!write && read == 0) {
+                write = true;
+                spinLock.store(false, std::memory_order_release);
+                return LockObj<true>(selfWeakPtr, Badge{});
+            } else {
+                spinLock.store(false, std::memory_order_release);
+                break;
+            }
         }
     }
     return LockObj<true>{};
@@ -142,17 +150,21 @@ UDPC::LockObj<false> UDPC::SharedSpinLock::trade_write_for_read_lock(UDPC::LockO
 
 UDPC::LockObj<false> UDPC::SharedSpinLock::try_trade_write_for_read_lock(UDPC::LockObj<true> &lockObj) {
     if (lockObj.isValid() && lockObj.badge.isValid) {
-        bool expected = false;
-        if (spinLock.compare_exchange_weak(expected, true, std::memory_order_acquire, std::memory_order_relaxed)) {
-            if (write && read == 0) {
-                read = 1;
-                write = false;
-                lockObj.isLocked = false;
-                lockObj.badge.isValid = false;
-                spinLock.store(false, std::memory_order_release);
-                return LockObj<false>(selfWeakPtr, Badge{});
-            } else {
-                spinLock.store(false, std::memory_order_release);
+        bool expected;
+        while (true) {
+            expected = false;
+            if (spinLock.compare_exchange_weak(expected, true, std::memory_order_acquire, std::memory_order_relaxed)) {
+                if (write && read == 0) {
+                    read = 1;
+                    write = false;
+                    lockObj.isLocked = false;
+                    lockObj.badge.isValid = false;
+                    spinLock.store(false, std::memory_order_release);
+                    return LockObj<false>(selfWeakPtr, Badge{});
+                } else {
+                    spinLock.store(false, std::memory_order_release);
+                    break;
+                }
             }
         }
     }
@@ -184,17 +196,21 @@ UDPC::LockObj<true> UDPC::SharedSpinLock::trade_read_for_write_lock(UDPC::LockOb
 
 UDPC::LockObj<true> UDPC::SharedSpinLock::try_trade_read_for_write_lock(UDPC::LockObj<false> &lockObj) {
     if (lockObj.isValid() && lockObj.badge.isValid) {
-        bool expected = false;
-        if (spinLock.compare_exchange_weak(expected, true, std::memory_order_acquire, std::memory_order_relaxed)) {
-            if (!write && read == 1) {
-                read = 0;
-                write = true;
-                lockObj.isLocked = false;
-                lockObj.badge.isValid = false;
-                spinLock.store(false, std::memory_order_release);
-                return LockObj<true>(selfWeakPtr, Badge{});
-            } else {
-                spinLock.store(false, std::memory_order_release);
+        bool expected;
+        while (true) {
+            expected = false;
+            if (spinLock.compare_exchange_weak(expected, true, std::memory_order_acquire, std::memory_order_relaxed)) {
+                if (!write && read == 1) {
+                    read = 0;
+                    write = true;
+                    lockObj.isLocked = false;
+                    lockObj.badge.isValid = false;
+                    spinLock.store(false, std::memory_order_release);
+                    return LockObj<true>(selfWeakPtr, Badge{});
+                } else {
+                    spinLock.store(false, std::memory_order_release);
+                    break;
+                }
             }
         }
     }