5 class FollySyncTest_Sequential: public cds_test::stress_fixture {
7 // Simulate as the data protected by the lock.
8 static size_t locked_data;
10 static size_t s_nMicroLockPassCount;
12 static size_t s_nMicroSpinLockPassCount;
14 static size_t s_nPicoSpinLockPassCount;
16 static size_t s_nSharedMutexPassCount;
18 static size_t s_nRWSpinLockPassCount;
20 static size_t s_nRWTicketSpinLockPassCount;
22 static size_t s_nRcuSyncPassCount;
23 static size_t s_nRcuNoSyncPassCount;
25 static void SetUpTestCase() {
26 const cds_test::config& cfg = get_config("SequentialFollySync");
27 GetConfigNonZeroExpected(MicroLockPassCount, 2000000000);
28 GetConfigNonZeroExpected(MicroSpinLockPassCount, 1500000000);
29 GetConfigNonZeroExpected(PicoSpinLockPassCount, 2700000000);
30 GetConfigNonZeroExpected(SharedMutexPassCount, 5000000);
31 GetConfigNonZeroExpected(RWSpinLockPassCount, 5000000);
32 GetConfigNonZeroExpected(RWTicketSpinLockPassCount, 5000000);
33 GetConfigNonZeroExpected(RcuSyncPassCount, 180000);
34 GetConfigNonZeroExpected(RcuNoSyncPassCount, 3500000);
37 static void run_rcu_sync(size_t pass_count) {
38 for (int write_percentage = 1; write_percentage <= 5; write_percentage += 1) {
39 for (size_t count = 0; count < pass_count; count++) {
40 for (int i = 0; i < 100; ++i) {
41 if (i < write_percentage) {
42 RcuData* data = new RcuData();
43 folly::rcu_retire(data);
44 folly::synchronize_rcu();
53 static void run_rcu_no_sync(size_t pass_count) {
54 for (int write_percentage = 1; write_percentage <= 5; write_percentage += 1) {
55 for (size_t count = 0; count < pass_count; count++) {
56 for (int i = 0; i < 100; ++i) {
57 if (i < write_percentage) {
58 RcuData* data = new RcuData();
59 folly::rcu_retire(data);
68 template <typename Lock>
69 static void run_rw_lock(size_t pass_count) {
70 std::unique_ptr<Lock> l(new Lock());
71 for (int write_percentage = 5; write_percentage < 20; write_percentage += 5) {
74 size_t write_lock_cnt = 0;
75 for (size_t count = 0; count < pass_count; count++) {
76 for (int i = 0; i < 100; ++i) {
77 if (i < write_percentage) {
84 read_sum = locked_data;
89 EXPECT_EQ(write_lock_cnt, locked_data);
90 EXPECT_EQ(locked_data, read_sum);
94 template <typename Lock>
95 static void run_small_lock(size_t pass_count) {
96 std::unique_ptr<Lock> l(new Lock());
99 for (size_t count = 0; count < pass_count; count++) {
104 EXPECT_EQ(locked_data, pass_count);
108 size_t FollySyncTest_Sequential::locked_data;
109 size_t FollySyncTest_Sequential::s_nMicroLockPassCount;
110 size_t FollySyncTest_Sequential::s_nMicroSpinLockPassCount;
111 size_t FollySyncTest_Sequential::s_nPicoSpinLockPassCount;
112 size_t FollySyncTest_Sequential::s_nSharedMutexPassCount;
113 size_t FollySyncTest_Sequential::s_nRWSpinLockPassCount;
114 size_t FollySyncTest_Sequential::s_nRWTicketSpinLockPassCount;
115 size_t FollySyncTest_Sequential::s_nRcuSyncPassCount;
116 size_t FollySyncTest_Sequential::s_nRcuNoSyncPassCount;
118 TEST_F(FollySyncTest_Sequential, FollyMicroSpinLock) {
119 run_small_lock<MicroSpinLock>(s_nMicroSpinLockPassCount);
122 TEST_F(FollySyncTest_Sequential, FollyPicoSpinLock) {
123 run_small_lock<PicoSpinLock>(s_nPicoSpinLockPassCount);
126 TEST_F(FollySyncTest_Sequential, FollyMicroLock) {
127 run_small_lock<MicroLock>(s_nMicroLockPassCount);
130 TEST_F(FollySyncTest_Sequential, FollyRCU_Sync) {
131 run_rcu_sync(s_nRcuSyncPassCount);
134 TEST_F(FollySyncTest_Sequential, FollyRCU_NoSync) {
135 run_rcu_no_sync(s_nRcuNoSyncPassCount);
138 TEST_F(FollySyncTest_Sequential, FollyRWTicketSpinLock_32) {
139 run_rw_lock<RWTicketSpinLock32>(s_nRWTicketSpinLockPassCount);
142 TEST_F(FollySyncTest_Sequential, FollyRWTicketSpinLock_64) {
143 run_rw_lock<RWTicketSpinLock64>(s_nRWTicketSpinLockPassCount);
146 TEST_F(FollySyncTest_Sequential, FollyRWSpinLock) {
147 run_rw_lock<RWSpinLock>(s_nRWSpinLockPassCount);
150 TEST_F(FollySyncTest_Sequential, FollySharedMutex_ReadPriority) {
151 run_rw_lock<SharedMutexReadPriority>(s_nSharedMutexPassCount);
154 TEST_F(FollySyncTest_Sequential, FollySharedMutex_WritePriority) {
155 run_rw_lock<SharedMutexWritePriority>(s_nSharedMutexPassCount);
158 } // namespace folly_test