for ( auto& i : arr )
list.put( &i );
- pool.add( new Worker<FreeList>( 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 );
+ std::unique_ptr<Worker<FreeList>> worker(
+ new Worker<FreeList>(pool, list));
+ worker->test();
// analyze result
size_t nTotal = 0;
for ( auto const& i : arr )
nTotal += i.counter;
- size_t nSuccess = 0;
- for ( size_t threadNo = 0; threadNo < pool.size(); ++threadNo )
- nSuccess += static_cast<Worker<FreeList>&>( pool.get( threadNo )).m_nSuccess;
-
- EXPECT_EQ( nSuccess, nTotal );
+ EXPECT_EQ( worker->m_nSuccess, nTotal );
list.clear( []( typename FreeList::node* ) {} );
}
size_t put_get::s_nThreadCount = 1;
size_t put_get::s_nPassCount = 100000;
-#define CDSSTRESS_FREELIST_F( name, freelist_type ) \
- TEST_F( put_get, name ) \
- { \
- freelist_type fl; \
- test( fl ); \
- }
+#define CDSSTRESS_FREELIST_F(name, freelist_type) \
+ TEST_F(put_get, name) { \
+ std::unique_ptr<freelist_type> fl(new freelist_type()); \
+ test(*fl); \
+ }
CDSSTRESS_FREELIST_F( FreeList, cds::intrusive::FreeList )
atomics::atomic<tagged_ptr> tp;
if ( tp.is_lock_free()) {
- cds::intrusive::TaggedFreeList fl;
- test( fl );
+ using FL = cds::intrusive::TaggedFreeList;
+ std::unique_ptr<FL> fl(new FL());
+ test( *fl );
}
else
std::cout << "Double-width CAS is not supported\n";