void operator()( tbb::blocked_range<size_t>& range ) const { typename M::scoped_lock lock2; for( size_t i=range.begin(); i!=range.end(); ++i ) { if( i&1 ) { typename M::scoped_lock lock1(my_mutex, true) ; if( lock1.downgrade_to_reader()==false ) REPORT("ERROR for %s: downgrade should always succeed\n", name); } else { lock2.acquire( my_mutex, false ); if( lock2.upgrade_to_writer()==false ) REPORT("ERROR for %s: upgrade should always succeed\n", name); lock2.release(); } } }
void TestTryAcquireReader_OneThread( const char * mutex_name ) { M tested_mutex; typename M::scoped_lock lock1; if( M::is_rw_mutex ) { if( lock1.try_acquire(tested_mutex, false) ) lock1.release(); else REPORT("ERROR for %s: try_acquire failed though it should not\n", mutex_name); { typename M::scoped_lock lock2(tested_mutex, false); if( lock1.try_acquire(tested_mutex) ) REPORT("ERROR for %s: try_acquire succeeded though it should not\n", mutex_name); lock2.release(); lock2.acquire(tested_mutex, true); if( lock1.try_acquire(tested_mutex, false) ) REPORT("ERROR for %s: try_acquire succeeded though it should not\n", mutex_name); } if( lock1.try_acquire(tested_mutex, false) ) lock1.release(); else REPORT("ERROR for %s: try_acquire failed though it should not\n", mutex_name); } }