X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=test%2Fstress%2Fparallel%2Fparallel_freelist_put_get_single.cpp;h=dfdc486849d50e52969a09410e4a26a5e21196fd;hb=bf562cb028f023b2d49dd7dd45fcaa3f5ddb91f3;hp=b8a00e3135723e3da8593a241be056dccdefa40f;hpb=f7b18ec599eadb55ea2e8757ba12fcab12e9f708;p=libcds.git diff --git a/test/stress/parallel/parallel_freelist_put_get_single.cpp b/test/stress/parallel/parallel_freelist_put_get_single.cpp index b8a00e31..dfdc4868 100644 --- a/test/stress/parallel/parallel_freelist_put_get_single.cpp +++ b/test/stress/parallel/parallel_freelist_put_get_single.cpp @@ -84,6 +84,7 @@ namespace { for ( size_t pass = 0; pass < s_nPassCount; ++pass ) { item_type* p; while ( (p = static_cast( m_FreeList.get())) == nullptr ); + p->counter.fetch_add( 1, atomics::memory_order_relaxed ); m_FreeList.put( p ); } } @@ -94,9 +95,11 @@ namespace { { cds_test::config const& cfg = get_config( "SequentialFreeList" ); - s_nPassCount = cfg.get_size_t( "SinglePassCount", s_nPassCount ); + 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; } @@ -113,21 +116,30 @@ namespace { list.put( &item ); pool.add( new Worker( pool, list ), s_nThreadCount ); - std::unique_ptr> worker( - new Worker(pool, list)); - worker->test(); + + 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 + EXPECT_EQ( item.counter.load( atomics::memory_order_relaxed ), s_nPassCount * s_nThreadCount ); + list.clear( []( typename FreeList::node* ) {} ); } }; - size_t put_get_single::s_nThreadCount = 1; + size_t put_get_single::s_nThreadCount = 4; size_t put_get_single::s_nPassCount = 100000; -#define CDSSTRESS_FREELIST_F(name, freelist_type) \ - TEST_F(put_get_single, name) { \ - std::unique_ptr fl(new freelist_type()); \ - test(*fl); \ - } +#define CDSSTRESS_FREELIST_F( name, freelist_type ) \ + TEST_F( put_get_single, name ) \ + { \ + freelist_type fl; \ + test( fl ); \ + } CDSSTRESS_FREELIST_F( FreeList, cds::intrusive::FreeList ) @@ -144,9 +156,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";