void test_timed_lock_shared_times_out_if_write_lock_held() { boost::shared_mutex rw_mutex; boost::mutex finish_mutex; boost::mutex unblocked_mutex; unsigned unblocked_count=0; boost::mutex::scoped_lock finish_lock(finish_mutex); boost::thread writer(simple_writing_thread(rw_mutex,finish_mutex,unblocked_mutex,unblocked_count)); boost::this_thread::sleep_for(boost::chrono::seconds(1)); CHECK_LOCKED_VALUE_EQUAL(unblocked_mutex,unblocked_count,1u); boost::chrono::steady_clock::time_point const start=boost::chrono::steady_clock::now(); boost::chrono::steady_clock::time_point const timeout=start+boost::chrono::milliseconds(500); boost::chrono::milliseconds const timeout_resolution(50); bool timed_lock_succeeded=rw_mutex.try_lock_shared_until(timeout); BOOST_CHECK((timeout-timeout_resolution)<boost::chrono::steady_clock::now()); BOOST_CHECK(!timed_lock_succeeded); if(timed_lock_succeeded) { rw_mutex.unlock_shared(); } boost::chrono::milliseconds const wait_duration(500); boost::chrono::steady_clock::time_point const timeout2=boost::chrono::steady_clock::now()+wait_duration; timed_lock_succeeded=rw_mutex.try_lock_shared_for(wait_duration); BOOST_CHECK((timeout2-timeout_resolution)<boost::chrono::steady_clock::now()); BOOST_CHECK(!timed_lock_succeeded); if(timed_lock_succeeded) { rw_mutex.unlock_shared(); } finish_lock.unlock(); writer.join(); }
void test_timed_lock_shared_times_out_if_write_lock_held() { boost::shared_mutex rw_mutex; boost::mutex finish_mutex; boost::mutex unblocked_mutex; unsigned unblocked_count=0; boost::mutex::scoped_lock finish_lock(finish_mutex); boost::thread writer(simple_writing_thread(rw_mutex,finish_mutex,unblocked_mutex,unblocked_count)); boost::thread::sleep(delay(1)); CHECK_LOCKED_VALUE_EQUAL(unblocked_mutex,unblocked_count,1u); boost::system_time const start=boost::get_system_time(); boost::system_time const timeout=start+boost::posix_time::milliseconds(500); boost::posix_time::milliseconds const timeout_resolution(50); bool timed_lock_succeeded=rw_mutex.timed_lock_shared(timeout); BOOST_CHECK((timeout-timeout_resolution)<boost::get_system_time()); BOOST_CHECK(!timed_lock_succeeded); if(timed_lock_succeeded) { rw_mutex.unlock_shared(); } boost::posix_time::milliseconds const wait_duration(500); boost::system_time const timeout2=boost::get_system_time()+wait_duration; timed_lock_succeeded=rw_mutex.timed_lock_shared(wait_duration); BOOST_CHECK((timeout2-timeout_resolution)<boost::get_system_time()); BOOST_CHECK(!timed_lock_succeeded); if(timed_lock_succeeded) { rw_mutex.unlock_shared(); } finish_lock.unlock(); writer.join(); }
void test_if_other_thread_has_write_lock_try_lock_upgrade_returns_false() { boost::shared_mutex rw_mutex; boost::mutex finish_mutex; boost::mutex unblocked_mutex; unsigned unblocked_count=0; boost::mutex::scoped_lock finish_lock(finish_mutex); boost::thread writer(simple_writing_thread(rw_mutex,finish_mutex,unblocked_mutex,unblocked_count)); boost::this_thread::sleep(boost::posix_time::seconds(1)); CHECK_LOCKED_VALUE_EQUAL(unblocked_mutex,unblocked_count,1u); bool const try_succeeded=rw_mutex.try_lock_upgrade(); BOOST_CHECK(!try_succeeded); if(try_succeeded) { rw_mutex.unlock_upgrade(); } finish_lock.unlock(); writer.join(); }