diff --git a/test/test_mutex.cpp b/test/test_mutex.cpp index e85459c4..2640aca7 100644 --- a/test/test_mutex.cpp +++ b/test/test_mutex.cpp @@ -7,6 +7,7 @@ #include #include +#include #include #include #include @@ -109,6 +110,8 @@ struct test_timedlock void operator()() { + test_lock_times_out_if_other_thread_has_lock()(); + mutex_type mutex; boost::condition condition; @@ -178,6 +181,67 @@ struct test_recursive_lock } }; +template +struct test_lock_times_out_if_other_thread_has_lock +{ + typedef boost::unique_lock Lock; + + Mutex m; + boost::mutex done_mutex; + bool done; + bool locked; + boost::condition_variable done_cond; + + test_lock_times_out_if_other_thread_has_lock(): + done(false),locked(false) + {} + + void locking_thread() + { + Lock lock(m,boost::defer_lock); + lock.timed_lock(boost::posix_time::milliseconds(50)); + + boost::lock_guard lk(done_mutex); + locked=lock.owns_lock(); + done=true; + done_cond.notify_one(); + } + + bool is_done() const + { + return done; + } + + + void operator()() + { + Lock lock(m); + + typedef test_lock_times_out_if_other_thread_has_lock this_type; + + boost::thread t(&this_type::locking_thread,this); + + try + { + { + boost::mutex::scoped_lock lk(done_mutex); + BOOST_CHECK(done_cond.timed_wait(lk,boost::posix_time::seconds(2), + boost::bind(&this_type::is_done,this))); + BOOST_CHECK(!locked); + } + + lock.unlock(); + t.join(); + } + catch(...) + { + lock.unlock(); + t.join(); + throw; + } + } +}; + void do_test_mutex() { test_lock()();