3 #include "cppunit/thread.h"
5 #include <cds/lock/spinlock.h>
7 // Multi-threaded stack test for push operation
10 #define TEST_CASE( N, L ) void N() { test<L>(); }
13 static size_t s_nThreadCount = 8;
14 static size_t s_nLoopCount = 1000000 ; // loop count per thread
16 static size_t s_nSharedInt;
19 class Spinlock_MT: public CppUnitMini::TestCase
22 class Thread: public CppUnitMini::TestThread
24 virtual TestThread * clone()
26 return new Thread( *this );
33 Thread( CppUnitMini::ThreadPool& pool, LOCK& l )
34 : CppUnitMini::TestThread( pool )
38 : CppUnitMini::TestThread( src )
39 , m_Lock( src.m_Lock )
42 Spinlock_MT& getTest()
44 return reinterpret_cast<Spinlock_MT&>( m_Pool.m_Test );
54 m_fTime = m_Timer.duration();
56 for ( size_t i = 0; i < s_nLoopCount; ++i ) {
62 m_fTime = m_Timer.duration() - m_fTime;
67 void setUpParams( const CppUnitMini::TestCfg& cfg ) {
68 s_nThreadCount = cfg.getULong("ThreadCount", 8 );
69 s_nLoopCount = cfg.getULong("LoopCount", 1000000 );
77 for ( size_t nThreadCount = 1; nThreadCount <= s_nThreadCount; nThreadCount *= 2 ) {
80 CppUnitMini::ThreadPool pool( *this );
81 pool.add( new Thread<LOCK>( pool, testLock ), nThreadCount );
83 CPPUNIT_MSG( " Lock test, thread count=" << nThreadCount
84 << " loop per thread=" << s_nLoopCount
88 CPPUNIT_MSG( " Duration=" << timer.duration() );
90 CPPUNIT_ASSERT_EX( s_nSharedInt == nThreadCount * s_nLoopCount,
91 "Expected=" << nThreadCount * s_nLoopCount
92 << " real=" << s_nSharedInt );
96 typedef cds::lock::Spinlock<cds::backoff::exponential<cds::backoff::hint, cds::backoff::yield> > Spinlock_exp;
98 typedef cds::lock::ReentrantSpinT<unsigned int, cds::backoff::exponential<cds::backoff::hint, cds::backoff::yield> > reentrantSpin_exp;
99 typedef cds::lock::ReentrantSpinT<unsigned int, cds::backoff::yield> reentrantSpin_yield;
100 typedef cds::lock::ReentrantSpinT<unsigned int, cds::backoff::hint> reentrantSpin_hint;
101 typedef cds::lock::ReentrantSpinT<unsigned int, cds::backoff::empty> reentrantSpin_empty;
103 TEST_CASE(spinLock_exp, Spinlock_exp );
104 TEST_CASE(spinLock_yield, cds::lock::Spinlock<cds::backoff::yield> );
105 TEST_CASE(spinLock_hint, cds::lock::Spinlock<cds::backoff::hint> );
106 TEST_CASE(spinLock_empty, cds::lock::Spinlock<cds::backoff::empty> );
108 TEST_CASE(reentrantSpinLock, cds::lock::ReentrantSpin );
109 TEST_CASE(reentrantSpinLock32, cds::lock::ReentrantSpin32 );
110 TEST_CASE(reentrantSpinLock64, cds::lock::ReentrantSpin64 );
112 TEST_CASE(reentrantSpinlock_exp, reentrantSpin_exp );
113 TEST_CASE(reentrantSpinlock_yield, reentrantSpin_yield );
114 TEST_CASE(reentrantSpinlock_hint, reentrantSpin_hint );
115 TEST_CASE(reentrantSpinlock_empty, reentrantSpin_empty );
118 CPPUNIT_TEST_SUITE(Spinlock_MT)
119 CPPUNIT_TEST(spinLock_exp);
120 CPPUNIT_TEST(spinLock_yield);
121 CPPUNIT_TEST(spinLock_hint);
122 CPPUNIT_TEST(spinLock_empty);
124 CPPUNIT_TEST(reentrantSpinLock);
125 CPPUNIT_TEST(reentrantSpinLock32);
126 CPPUNIT_TEST(reentrantSpinLock64);
128 CPPUNIT_TEST(reentrantSpinlock_exp)
129 CPPUNIT_TEST(reentrantSpinlock_yield)
130 CPPUNIT_TEST(reentrantSpinlock_hint)
131 CPPUNIT_TEST(reentrantSpinlock_empty)
132 CPPUNIT_TEST_SUITE_END();
137 CPPUNIT_TEST_SUITE_REGISTRATION(lock::Spinlock_MT);