X-Git-Url: http://plrg.eecs.uci.edu/git/?p=libcds.git;a=blobdiff_plain;f=test%2Fstress%2Fparallel%2Fparallel_freelist_put_get.cpp;h=8e7a5461cdbb09ecfd8ed0623e35bbf2902eea47;hp=04308c996882875432b1bee731bce8c01ee41a53;hb=bf562cb028f023b2d49dd7dd45fcaa3f5ddb91f3;hpb=f7b18ec599eadb55ea2e8757ba12fcab12e9f708 diff --git a/test/stress/parallel/parallel_freelist_put_get.cpp b/test/stress/parallel/parallel_freelist_put_get.cpp index 04308c99..8e7a5461 100644 --- a/test/stress/parallel/parallel_freelist_put_get.cpp +++ b/test/stress/parallel/parallel_freelist_put_get.cpp @@ -105,11 +105,13 @@ namespace { public: static void SetUpTestCase() { - cds_test::config const& cfg = get_config( "SequentialFreeList" ); + cds_test::config const& cfg = get_config( "ParallelFreeList" ); + s_nThreadCount = cfg.get_size_t( "ThreadCount", s_nThreadCount ); s_nPassCount = cfg.get_size_t( "PassCount", s_nPassCount ); - s_nThreadCount = 1; + if ( s_nThreadCount == 0 ) + s_nThreadCount = 1; if ( s_nPassCount == 0 ) s_nPassCount = 1000; } @@ -127,29 +129,39 @@ namespace { for ( auto& i : arr ) list.put( &i ); - std::unique_ptr> worker( - new Worker(pool, list)); - worker->test(); + pool.add( new Worker( pool, list ), s_nThreadCount ); + + propout() << std::make_pair( "work_thread", s_nThreadCount ) + << std::make_pair( "pass_count", s_nPassCount ); + + std::chrono::milliseconds duration = pool.run(); + + propout() << std::make_pair( "duration", duration ); // analyze result size_t nTotal = 0; for ( auto const& i : arr ) nTotal += i.counter; - EXPECT_EQ( worker->m_nSuccess, nTotal ); + size_t nSuccess = 0; + for ( size_t threadNo = 0; threadNo < pool.size(); ++threadNo ) + nSuccess += static_cast&>( pool.get( threadNo )).m_nSuccess; + + EXPECT_EQ( nSuccess, nTotal ); list.clear( []( typename FreeList::node* ) {} ); } }; - size_t put_get::s_nThreadCount = 1; + size_t put_get::s_nThreadCount = 4; size_t put_get::s_nPassCount = 100000; -#define CDSSTRESS_FREELIST_F(name, freelist_type) \ - TEST_F(put_get, name) { \ - std::unique_ptr fl(new freelist_type()); \ - test(*fl); \ - } +#define CDSSTRESS_FREELIST_F( name, freelist_type ) \ + TEST_F( put_get, name ) \ + { \ + freelist_type fl; \ + test( fl ); \ + } CDSSTRESS_FREELIST_F( FreeList, cds::intrusive::FreeList ) @@ -166,9 +178,8 @@ namespace { atomics::atomic tp; if ( tp.is_lock_free()) { - using FL = cds::intrusive::TaggedFreeList; - std::unique_ptr fl(new FL()); - test( *fl ); + cds::intrusive::TaggedFreeList fl; + test( fl ); } else std::cout << "Double-width CAS is not supported\n";