1 #include <folly/SmallLocks.h>
2 #include <folly/RWSpinLock.h>
3 #include <folly/SharedMutex.h>
4 #include <folly/synchronization/Rcu.h>
6 #include <gtest/gtest.h>
13 const size_t kMicroLockPassCount = 2000000000;
14 typedef folly::MicroLock MicroLock;
17 const size_t kMicroSpinLockPassCount = 1500000000;
18 typedef folly::MicroSpinLock MicroSpinLock;
21 const size_t kPicoSpinLockPassCount = 2700000000;
22 typedef folly::PicoSpinLock<size_t> PicoSpinLock;
25 const size_t kSharedMutexPassCount = 5000000;
26 typedef folly::SharedMutexReadPriority SharedMutexReadPriority;
27 typedef folly::SharedMutexWritePriority SharedMutexWritePriority;
30 const size_t kRWSpinLockPassCount = 5000000;
31 typedef folly::RWSpinLock RWSpinLock;
34 const size_t kRWTicketSpinLockPassCount = 5000000;
35 typedef folly::RWTicketSpinLock32 RWTicketSpinLock32;
36 typedef folly::RWTicketSpinLock64 RWTicketSpinLock64;
39 const size_t kRcuSyncPassCount = 180000;
40 const size_t kRcuNoSyncPassCount = 3500000;
41 // Represent the RCU-protected data.
49 void run_rcu_sync(size_t pass_count) {
50 for (int write_percentage = 1; write_percentage <= 5; write_percentage += 1) {
51 for (size_t count = 0; count < pass_count; count++) {
52 for (int i = 0; i < 100; ++i) {
53 if (i < write_percentage) {
54 RcuFoo* f = new RcuFoo();
56 folly::synchronize_rcu();
65 void run_rcu_no_sync(size_t pass_count) {
66 for (int write_percentage = 1; write_percentage <= 5; write_percentage += 1) {
67 for (size_t count = 0; count < pass_count; count++) {
68 for (int i = 0; i < 100; ++i) {
69 if (i < write_percentage) {
70 RcuFoo* f = new RcuFoo();
80 template <typename Lock>
81 void run_rw_lock(size_t pass_count) {
82 std::unique_ptr<Lock> l(new Lock());
83 for (int write_percentage = 5; write_percentage < 20; write_percentage += 5) {
84 for (size_t count = 0; count < pass_count; count++) {
85 for (int i = 0; i < 100; ++i) {
86 if (i < write_percentage) {
98 template <typename Lock>
99 void run_small_lock(size_t pass_count) {
100 std::unique_ptr<Lock> l(new Lock());
102 for (size_t count = 0; count < pass_count; count++) {
108 class FollySyncTest: public ::testing::Test {
112 TEST_F(FollySyncTest, FollyRCU_Sync) {
113 run_rcu_sync(kRcuSyncPassCount);
116 TEST_F(FollySyncTest, FollyRCU_NoSync) {
117 run_rcu_no_sync(kRcuNoSyncPassCount);
120 TEST_F(FollySyncTest, FollyRWTicketSpinLock_32) {
121 run_rw_lock<RWTicketSpinLock32>(kRWTicketSpinLockPassCount);
124 TEST_F(FollySyncTest, FollyRWTicketSpinLock_64) {
125 run_rw_lock<RWTicketSpinLock64>(kRWTicketSpinLockPassCount);
128 TEST_F(FollySyncTest, FollyRWSpinLock) {
129 run_rw_lock<RWSpinLock>(kRWSpinLockPassCount);
132 TEST_F(FollySyncTest, FollySharedMutex_ReadPriority) {
133 run_rw_lock<SharedMutexReadPriority>(kSharedMutexPassCount);
136 TEST_F(FollySyncTest, FollySharedMutex_WritePriority) {
137 run_rw_lock<SharedMutexWritePriority>(kSharedMutexPassCount);
140 TEST_F(FollySyncTest, FollyMicroSpinLock) {
141 run_small_lock<MicroSpinLock>(kMicroSpinLockPassCount);
144 TEST_F(FollySyncTest, FollyPicoSpinLock) {
145 run_small_lock<PicoSpinLock>(kPicoSpinLockPassCount);
148 TEST_F(FollySyncTest, FollyMicroLock) {
149 run_small_lock<MicroLock>(kMicroLockPassCount);
152 int main(int argc, char** argv) {
154 ::testing::InitGoogleTest(&argc, argv);
155 int result = RUN_ALL_TESTS();