Boost logo

Boost-Commit :

From: anthony_at_[hidden]
Date: 2008-08-19 03:03:23


Author: anthonyw
Date: 2008-08-19 03:03:22 EDT (Tue, 19 Aug 2008)
New Revision: 48209
URL: http://svn.boost.org/trac/boost/changeset/48209

Log:
Renamed internal bind stuff to invoker, as more expressive
Text files modified:
   trunk/libs/thread/test/test_mutex.cpp | 64 ++++++++++++++++++++++++++++++++++++++++
   1 files changed, 64 insertions(+), 0 deletions(-)

Modified: trunk/libs/thread/test/test_mutex.cpp
==============================================================================
--- trunk/libs/thread/test/test_mutex.cpp (original)
+++ trunk/libs/thread/test/test_mutex.cpp 2008-08-19 03:03:22 EDT (Tue, 19 Aug 2008)
@@ -7,6 +7,7 @@
 #include <boost/thread/detail/config.hpp>
 
 #include <boost/thread/mutex.hpp>
+#include <boost/thread/thread.hpp>
 #include <boost/thread/recursive_mutex.hpp>
 #include <boost/thread/thread_time.hpp>
 #include <boost/thread/condition.hpp>
@@ -109,6 +110,8 @@
 
     void operator()()
     {
+ test_lock_times_out_if_other_thread_has_lock<mutex_type>()();
+
         mutex_type mutex;
         boost::condition condition;
 
@@ -178,6 +181,67 @@
     }
 };
 
+template<typename Mutex>
+struct test_lock_times_out_if_other_thread_has_lock
+{
+ typedef boost::unique_lock<Mutex> 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<boost::mutex> 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<Mutex> 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<boost::mutex>()();


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk