# HG changeset patch # User Sebastien Jodogne # Date 1372931282 -7200 # Node ID 80f7539147a25c914a14ae4645e1ce704c10a48b # Parent 0e8bd937a0f37f724e90c4a34fb982f7a0f86826 WaitEmpty diff -r 0e8bd937a0f3 -r 80f7539147a2 Core/MultiThreading/SharedMessageQueue.cpp --- a/Core/MultiThreading/SharedMessageQueue.cpp Thu Jul 04 09:53:15 2013 +0200 +++ b/Core/MultiThreading/SharedMessageQueue.cpp Thu Jul 04 11:48:02 2013 +0200 @@ -89,7 +89,34 @@ std::auto_ptr message(queue_.front()); queue_.pop_front(); + emptied_.notify_all(); return message.release(); } + + + + bool SharedMessageQueue::WaitEmpty(int32_t millisecondsTimeout) + { + boost::mutex::scoped_lock lock(mutex_); + + // Wait for the queue to become empty + if (!queue_.empty()) + { + if (millisecondsTimeout == 0) + { + emptied_.wait(lock); + } + else + { + if (!emptied_.timed_wait + (lock, boost::posix_time::milliseconds(millisecondsTimeout))) + { + return false; + } + } + } + + return true; + } } diff -r 0e8bd937a0f3 -r 80f7539147a2 Core/MultiThreading/SharedMessageQueue.h --- a/Core/MultiThreading/SharedMessageQueue.h Thu Jul 04 09:53:15 2013 +0200 +++ b/Core/MultiThreading/SharedMessageQueue.h Thu Jul 04 11:48:02 2013 +0200 @@ -49,6 +49,7 @@ Queue queue_; boost::mutex mutex_; boost::condition_variable elementAvailable_; + boost::condition_variable emptied_; public: SharedMessageQueue(unsigned int maxSize = 0); @@ -60,5 +61,7 @@ // The caller is responsible to delete the dequeud message! IDynamicObject* Dequeue(int32_t millisecondsTimeout); + + bool WaitEmpty(int32_t millisecondsTimeout); }; } diff -r 0e8bd937a0f3 -r 80f7539147a2 UnitTests/main.cpp --- a/UnitTests/main.cpp Thu Jul 04 09:53:15 2013 +0200 +++ b/UnitTests/main.cpp Thu Jul 04 11:48:02 2013 +0200 @@ -419,18 +419,21 @@ TEST(SharedMessageQueue, Basic) { SharedMessageQueue q; + ASSERT_TRUE(q.WaitEmpty(0)); q.Enqueue(new DynamicInteger(10)); + ASSERT_FALSE(q.WaitEmpty(1)); q.Enqueue(new DynamicInteger(20)); q.Enqueue(new DynamicInteger(30)); q.Enqueue(new DynamicInteger(40)); std::auto_ptr i; - i.reset(dynamic_cast(q.Dequeue(10))); ASSERT_EQ(10, i->GetValue()); - i.reset(dynamic_cast(q.Dequeue(10))); ASSERT_EQ(20, i->GetValue()); - i.reset(dynamic_cast(q.Dequeue(10))); ASSERT_EQ(30, i->GetValue()); - i.reset(dynamic_cast(q.Dequeue(10))); ASSERT_EQ(40, i->GetValue()); - - ASSERT_EQ(NULL, q.Dequeue(10)); + i.reset(dynamic_cast(q.Dequeue(1))); ASSERT_EQ(10, i->GetValue()); + i.reset(dynamic_cast(q.Dequeue(1))); ASSERT_EQ(20, i->GetValue()); + i.reset(dynamic_cast(q.Dequeue(1))); ASSERT_EQ(30, i->GetValue()); + ASSERT_FALSE(q.WaitEmpty(1)); + i.reset(dynamic_cast(q.Dequeue(1))); ASSERT_EQ(40, i->GetValue()); + ASSERT_TRUE(q.WaitEmpty(0)); + ASSERT_EQ(NULL, q.Dequeue(1)); }