# HG changeset patch # User Alain Mazy # Date 1764868979 -3600 # Node ID 30eb6295e559834e6e9e0d9c3c4fe622eda62e15 # Parent c4cfb25a932bc66bc379589826d0b9c9d48c7e0c Blocking queue: WaitEmpty diff -r c4cfb25a932b -r 30eb6295e559 OrthancFramework/Sources/MultiThreading/BlockingSharedMessageQueue.cpp --- a/OrthancFramework/Sources/MultiThreading/BlockingSharedMessageQueue.cpp Tue Dec 02 17:08:41 2025 +0100 +++ b/OrthancFramework/Sources/MultiThreading/BlockingSharedMessageQueue.cpp Thu Dec 04 18:22:59 2025 +0100 @@ -103,9 +103,39 @@ roomAvailable_.notify_one(); + if (queue_.empty()) + { + emptied_.notify_all(); + } + return message.release(); } + bool BlockingSharedMessageQueue::WaitEmpty(int32_t millisecondsTimeout) + { + boost::mutex::scoped_lock lock(mutex_); + + // Wait for the queue to become empty + while (!queue_.empty()) + { + if (millisecondsTimeout == 0) + { + emptied_.wait(lock); + } + else + { + if (!emptied_.timed_wait + (lock, boost::posix_time::milliseconds(millisecondsTimeout))) + { + return false; + } + } + } + + return true; + } + + void BlockingSharedMessageQueue::Clear() { boost::mutex::scoped_lock lock(mutex_); @@ -124,6 +154,8 @@ roomAvailable_.notify_one(); } } + + emptied_.notify_all(); } size_t BlockingSharedMessageQueue::GetSize() diff -r c4cfb25a932b -r 30eb6295e559 OrthancFramework/Sources/MultiThreading/BlockingSharedMessageQueue.h --- a/OrthancFramework/Sources/MultiThreading/BlockingSharedMessageQueue.h Tue Dec 02 17:08:41 2025 +0100 +++ b/OrthancFramework/Sources/MultiThreading/BlockingSharedMessageQueue.h Thu Dec 04 18:22:59 2025 +0100 @@ -45,6 +45,7 @@ boost::mutex mutex_; boost::condition_variable elementAvailable_; boost::condition_variable roomAvailable_; + boost::condition_variable emptied_; public: explicit BlockingSharedMessageQueue(unsigned int maxSize = 0); @@ -60,6 +61,8 @@ // The caller is responsible to delete the dequeued message! IDynamicObject* Dequeue(int32_t millisecondsTimeout); + bool WaitEmpty(int32_t millisecondsTimeout); + void Clear(); size_t GetSize();