2 * Copyright 2014 Facebook, Inc.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 // @author: Andrei Alexandrescu (aalexandre)
19 // Test bed for folly/Synchronized.h
21 #include <folly/Synchronized.h>
22 #include <folly/RWSpinLock.h>
23 #include <folly/test/SynchronizedTestLib.h>
24 #include <gtest/gtest.h>
27 TEST(Synchronized, Basic) {
28 testBasic<std::mutex>();
29 testBasic<std::recursive_mutex>();
31 testBasic<std::timed_mutex>();
32 testBasic<std::recursive_timed_mutex>();
35 #ifdef RW_SPINLOCK_USE_X86_INTRINSIC_
36 testBasic<folly::RWTicketSpinLock32>();
39 testBasic<boost::mutex>();
40 testBasic<boost::recursive_mutex>();
41 testBasic<boost::shared_mutex>();
43 testBasic<boost::timed_mutex>();
44 testBasic<boost::recursive_timed_mutex>();
48 TEST(Synchronized, Concurrency) {
49 testConcurrency<std::mutex>();
50 testConcurrency<std::recursive_mutex>();
52 testConcurrency<std::timed_mutex>();
53 testConcurrency<std::recursive_timed_mutex>();
56 #ifdef RW_SPINLOCK_USE_X86_INTRINSIC_
57 testConcurrency<folly::RWTicketSpinLock32>();
60 testConcurrency<boost::mutex>();
61 testConcurrency<boost::recursive_mutex>();
62 testConcurrency<boost::shared_mutex>();
64 testConcurrency<boost::timed_mutex>();
65 testConcurrency<boost::recursive_timed_mutex>();
70 TEST(Synchronized, DualLocking) {
71 testDualLocking<std::mutex>();
72 testDualLocking<std::recursive_mutex>();
74 testDualLocking<std::timed_mutex>();
75 testDualLocking<std::recursive_timed_mutex>();
78 #ifdef RW_SPINLOCK_USE_X86_INTRINSIC_
79 testDualLocking<folly::RWTicketSpinLock32>();
82 testDualLocking<boost::mutex>();
83 testDualLocking<boost::recursive_mutex>();
84 testDualLocking<boost::shared_mutex>();
86 testDualLocking<boost::timed_mutex>();
87 testDualLocking<boost::recursive_timed_mutex>();
92 TEST(Synchronized, DualLockingWithConst) {
93 testDualLockingWithConst<std::mutex>();
94 testDualLockingWithConst<std::recursive_mutex>();
96 testDualLockingWithConst<std::timed_mutex>();
97 testDualLockingWithConst<std::recursive_timed_mutex>();
100 #ifdef RW_SPINLOCK_USE_X86_INTRINSIC_
101 testDualLockingWithConst<folly::RWTicketSpinLock32>();
104 testDualLockingWithConst<boost::mutex>();
105 testDualLockingWithConst<boost::recursive_mutex>();
106 testDualLockingWithConst<boost::shared_mutex>();
108 testDualLockingWithConst<boost::timed_mutex>();
109 testDualLockingWithConst<boost::recursive_timed_mutex>();
115 TEST(Synchronized, TimedSynchronized) {
116 testTimedSynchronized<std::timed_mutex>();
117 testTimedSynchronized<std::recursive_timed_mutex>();
119 testTimedSynchronized<boost::timed_mutex>();
120 testTimedSynchronized<boost::recursive_timed_mutex>();
121 testTimedSynchronized<boost::shared_mutex>();
123 testTimedSynchronizedWithConst<boost::shared_mutex>();
127 TEST(Synchronized, ConstCopy) {
129 testConstCopy<std::timed_mutex>();
130 testConstCopy<std::recursive_timed_mutex>();
132 testConstCopy<boost::timed_mutex>();
133 testConstCopy<boost::recursive_timed_mutex>();
135 testConstCopy<boost::shared_mutex>();