#define TASK(lock_type, lock_ptr, pass_cnt) \
static void Thread##lock_type() { \
for (int i = 0; i < pass_cnt; i++) { \
- for (int j = 0; j < pass_cnt; j++) { \
- lock_ptr->lock(); \
- x = i + j; \
- lock_ptr->unlock(); \
- } \
+ lock_ptr->lock(); \
+ x++; \
+ lock_ptr->unlock(); \
} \
}
-#define LOCK_TEST(lock_type, lock_ptr) \
+#define LOCK_TEST(lock_type, lock_ptr, pass_cnt) \
TEST_F(SpinLockTest, lock_type) { \
lock_ptr = new lock_type(); \
+ x = 0; \
std::thread *threads = new std::thread[s_nSpinLockThreadCount]; \
for (int i = 0; i < s_nSpinLockThreadCount; i++) { \
threads[i] = std::thread(Thread##lock_type); \
for (int i = 0; i < s_nSpinLockThreadCount; i++) { \
threads[i].join(); \
} \
+ if (x != s_nSpinLockThreadCount * pass_cnt) { \
+ cout << "Incorrect " << #lock_type << "\n"; \
+ } \
}
class SpinLockTest : public cds_test::stress_fixture {
Reentrant32 *SpinLockTest::reentrant_mutex32;
Reentrant64 *SpinLockTest::reentrant_mutex64;
-LOCK_TEST(TicketLock, ticket_mutex)
-LOCK_TEST(SpinLock, spin_mutex)
-LOCK_TEST(Reentrant32, reentrant_mutex32)
-LOCK_TEST(Reentrant64, reentrant_mutex64)
+LOCK_TEST(TicketLock, ticket_mutex, s_nTicketLockPassCount)
+LOCK_TEST(SpinLock, spin_mutex, s_nSpinLockPassCount)
+LOCK_TEST(Reentrant32, reentrant_mutex32, s_nSpinLockPassCount)
+LOCK_TEST(Reentrant64, reentrant_mutex64, s_nSpinLockPassCount)
} // namespace