Move libcds 1.6.0 from SVN
[libcds.git] / tests / test-hdr / misc / thread_init_fini.cpp
1 //$$CDS-header$$
2
3 #include "cppunit/thread.h"
4 #include <cds/threading/model.h>
5
6 namespace {
7     static size_t s_nThreadCount = 8;
8     static size_t s_nPassCount = 1000000;
9 }
10
11 class thread_init_fini: public CppUnitMini::TestCase
12 {
13     class Thread: public CppUnitMini::TestThread
14     {
15         virtual TestThread *    clone()
16         {
17             return new Thread( *this );
18         }
19
20     public:
21         Thread( CppUnitMini::ThreadPool& pool )
22             : CppUnitMini::TestThread( pool )
23         {}
24         Thread( Thread& src )
25             : CppUnitMini::TestThread( src )
26         {}
27
28         thread_init_fini&  getTest()
29         {
30             return reinterpret_cast<thread_init_fini&>( m_Pool.m_Test );
31         }
32
33         virtual void init()
34         {}
35         virtual void fini()
36         {}
37
38         virtual void test()
39         {
40             for ( size_t i = 0; i < s_nPassCount; ++i ) {
41                 CPPUNIT_ASSERT(!cds::threading::Manager::isThreadAttached());
42                 if ( !cds::threading::Manager::isThreadAttached() )
43                     cds::threading::Manager::attachThread();
44                 CPPUNIT_ASSERT( cds::threading::Manager::isThreadAttached() );
45                 cds::threading::Manager::detachThread();
46             }
47         }
48     };
49
50 protected:
51     void init_fini()
52     {
53         CPPUNIT_MSG( "Thread init/fini test,\n    thread count=" << s_nThreadCount << " pass count=" << s_nPassCount << "..." );
54
55         CppUnitMini::ThreadPool pool( *this );
56
57         pool.add( new Thread( pool ), s_nThreadCount );
58
59         cds::OS::Timer    timer;
60         timer.reset();
61
62         pool.run();
63
64         CPPUNIT_MSG( "   Duration=" << timer.duration() );
65     }
66
67     void setUpParams( const CppUnitMini::TestCfg& cfg ) {
68         s_nThreadCount = cfg.getULong("ThreadCount", 8 );
69         s_nPassCount = cfg.getULong("PassCount", 1000000 );
70     }
71
72     CPPUNIT_TEST_SUITE(thread_init_fini)
73         CPPUNIT_TEST(init_fini);
74     CPPUNIT_TEST_SUITE_END();
75 };
76
77 CPPUNIT_TEST_SUITE_REGISTRATION(thread_init_fini);