Fix asm constraints in folly::MicroSpinLock::cas
[folly.git] / folly / test / SmallLocksTest.cpp
index e7cc04fc1e9c6deb7d0d36410c3596a3cbb98c1d..dedc476fef4d77dbcdcbcd9ac438fa92c6b05fe4 100644 (file)
@@ -17,6 +17,7 @@
 #include "folly/SmallLocks.h"
 #include <cassert>
 #include <cstdio>
+#include <mutex>
 #include <string>
 #include <vector>
 #include <pthread.h>
@@ -102,6 +103,22 @@ void doPslTest() {
   }
 }
 
+struct TestClobber {
+  TestClobber() {
+    lock_.init();
+  }
+
+  void go() {
+    std::lock_guard<MicroSpinLock> g(lock_);
+    // This bug depends on gcc register allocation and is very sensitive. We
+    // have to use DCHECK instead of EXPECT_*.
+    DCHECK(!lock_.try_lock());
+  }
+
+ private:
+  MicroSpinLock lock_;
+};
+
 }
 
 TEST(SmallLocks, SpinLockCorrectness) {
@@ -140,3 +157,7 @@ TEST(SmallLocks, PicoSpinSigned) {
   }
   EXPECT_EQ(val.getData(), -8);
 }
+
+TEST(SmallLocks, RegClobber) {
+  TestClobber().go();
+}