@@ -33,6 +33,7 @@ DEALINGS IN THE SOFTWARE.
3333
3434*/
3535
36+ #include < atomic>
3637#include < chrono>
3738#include < condition_variable>
3839#include < cstddef>
@@ -42,7 +43,6 @@ DEALINGS IN THE SOFTWARE.
4243#include < utility> // IWYU pragma: keep
4344
4445#ifdef OSMIUM_DEBUG_QUEUE_SIZE
45- # include < atomic>
4646# include < iostream>
4747#endif
4848
@@ -73,6 +73,8 @@ namespace osmium {
7373 // / Used to signal producers when queue is not full.
7474 std::condition_variable m_space_available;
7575
76+ std::atomic<bool > m_in_use{true };
77+
7678#ifdef OSMIUM_DEBUG_QUEUE_SIZE
7779 // / The largest size the queue has been so far.
7880 std::size_t m_largest_size;
@@ -145,6 +147,9 @@ namespace osmium {
145147 * this call will block if the queue is full.
146148 */
147149 void push (T value) {
150+ if (!m_in_use) {
151+ return ;
152+ }
148153 constexpr const std::chrono::milliseconds max_wait{10 };
149154#ifdef OSMIUM_DEBUG_QUEUE_SIZE
150155 ++m_push_counter;
@@ -181,7 +186,7 @@ namespace osmium {
181186 }
182187#endif
183188 m_data_available.wait (lock, [this ] {
184- return !m_queue.empty ();
189+ return !m_in_use || ! m_queue.empty ();
185190 });
186191 if (!m_queue.empty ()) {
187192 value = std::move (m_queue.front ());
@@ -224,6 +229,19 @@ namespace osmium {
224229 return m_queue.size ();
225230 }
226231
232+ bool in_use () const noexcept {
233+ return m_in_use;
234+ }
235+
236+ void shutdown () {
237+ m_in_use = false ;
238+ std::lock_guard<std::mutex> lock{m_mutex};
239+ while (!m_queue.empty ()) {
240+ m_queue.pop ();
241+ }
242+ m_data_available.notify_all ();
243+ }
244+
227245 }; // class Queue
228246
229247 } // namespace thread
0 commit comments