Refactors folly sync test cases
[folly.git] / folly / stress-test / stress-sequential-folly-sync.cpp
index 8a7a1d1fce2843996ed0c7fcde8de61459534157..9622230407976c2653e6dfbad690c6574df0acd2 100644 (file)
@@ -6,6 +6,7 @@ class FollySyncTest_Sequential: public cds_test::stress_fixture {
 protected:
   // Simulate as the data protected by the lock.
   static size_t locked_data;
+  static std::atomic<RcuData*> rcu_data;
   // MicroLock
   static size_t s_nMicroLockPassCount;
   // MicroSpinLock
@@ -21,6 +22,7 @@ protected:
   // RCU
   static size_t s_nRcuSyncPassCount;
   static size_t s_nRcuNoSyncPassCount;
+  static size_t s_nRcuReaderOnlyPassCount;
 
   static void SetUpTestCase() {
     const cds_test::config& cfg = get_config("SequentialFollySync");
@@ -32,36 +34,66 @@ protected:
     GetConfigNonZeroExpected(RWTicketSpinLockPassCount, 5000000);
     GetConfigNonZeroExpected(RcuSyncPassCount, 180000);
     GetConfigNonZeroExpected(RcuNoSyncPassCount, 3500000);
+    GetConfigNonZeroExpected(RcuReaderOnlyPassCount, 3000000);
+
+    // Initialize the RCU protected data.
+    rcu_data.store(new RcuData(), std::memory_order_relaxed);
+  }
+
+  static void run_rcu_reader_only(size_t pass_count) {
+    size_t sum = 1;
+    for (size_t count = 0; count < pass_count; count++) {
+      folly::rcu_reader g;
+      auto *data = rcu_data.load(std::memory_order_relaxed);
+      sum += (data->d1 + data->d2);
+    }
+    EXPECT_EQ(sum, 1);
   }
 
   static void run_rcu_sync(size_t pass_count) {
     for (int write_percentage = 1; write_percentage <= 5; write_percentage += 1) {
+      size_t sum = 0;
       for (size_t count = 0; count < pass_count; count++) {
         for (int i = 0; i < 100; ++i) {
           if (i < write_percentage) {
-            RcuData* data = new RcuData();
-            folly::rcu_retire(data);
+            auto* old_data = rcu_data.load(std::memory_order_relaxed);
+            auto* new_data = new RcuData(*old_data);
+            new_data->d1++;
+            new_data->d2++;
+            rcu_data.store(new_data, std::memory_order_relaxed);
             folly::synchronize_rcu();
+            delete old_data;
           } else {
             folly::rcu_reader g;
+            auto* data = rcu_data.load(std::memory_order_relaxed);
+            sum += (data->d1 + data->d2);
           }
         }
       }
+      EXPECT_GT(sum, 0);
     }
   }
 
   static void run_rcu_no_sync(size_t pass_count) {
     for (int write_percentage = 1; write_percentage <= 5; write_percentage += 1) {
+      size_t sum = 0;
       for (size_t count = 0; count < pass_count; count++) {
         for (int i = 0; i < 100; ++i) {
           if (i < write_percentage) {
-            RcuData* data = new RcuData();
-            folly::rcu_retire(data);
+            auto* old_data = rcu_data.load(std::memory_order_relaxed);
+            auto* new_data = new RcuData(*old_data);
+            new_data->d1++;
+            new_data->d2++;
+            rcu_data.store(new_data, std::memory_order_relaxed);
+            folly::rcu_retire(old_data);
           } else {
             folly::rcu_reader g;
+            auto* data = rcu_data.load(std::memory_order_relaxed);
+            sum += (data->d1 + data->d2);
           }
         }
       }
+      EXPECT_GT(sum, 0);
     }
   }
 
@@ -106,6 +138,7 @@ protected:
 };
 
 size_t FollySyncTest_Sequential::locked_data;
+std::atomic<RcuData*> FollySyncTest_Sequential::rcu_data;
 size_t FollySyncTest_Sequential::s_nMicroLockPassCount;
 size_t FollySyncTest_Sequential::s_nMicroSpinLockPassCount;
 size_t FollySyncTest_Sequential::s_nPicoSpinLockPassCount;
@@ -114,6 +147,19 @@ size_t FollySyncTest_Sequential::s_nRWSpinLockPassCount;
 size_t FollySyncTest_Sequential::s_nRWTicketSpinLockPassCount;
 size_t FollySyncTest_Sequential::s_nRcuSyncPassCount;
 size_t FollySyncTest_Sequential::s_nRcuNoSyncPassCount;
+size_t FollySyncTest_Sequential::s_nRcuReaderOnlyPassCount;
+
+TEST_F(FollySyncTest_Sequential, FollyRCU_ReaderOnly) {
+  run_rcu_reader_only(s_nRcuReaderOnlyPassCount);
+}
+
+TEST_F(FollySyncTest_Sequential, FollyRCU_Sync) {
+  run_rcu_sync(s_nRcuSyncPassCount);
+}
+
+TEST_F(FollySyncTest_Sequential, FollyRCU_NoSync) {
+  run_rcu_no_sync(s_nRcuNoSyncPassCount);
+}
 
 TEST_F(FollySyncTest_Sequential, FollyMicroSpinLock) {
   run_small_lock<MicroSpinLock>(s_nMicroSpinLockPassCount);
@@ -127,14 +173,6 @@ TEST_F(FollySyncTest_Sequential, FollyMicroLock) {
   run_small_lock<MicroLock>(s_nMicroLockPassCount);
 }
 
-TEST_F(FollySyncTest_Sequential, FollyRCU_Sync) {
-  run_rcu_sync(s_nRcuSyncPassCount);
-}
-
-TEST_F(FollySyncTest_Sequential, FollyRCU_NoSync) {
-  run_rcu_no_sync(s_nRcuNoSyncPassCount);
-}
-
 TEST_F(FollySyncTest_Sequential, FollyRWTicketSpinLock_32) {
   run_rw_lock<RWTicketSpinLock32>(s_nRWTicketSpinLockPassCount);
 }