diff --git a/lib/include/srsran/adt/circular_buffer.h b/lib/include/srsran/adt/circular_buffer.h index a88ef43c0..e162373cf 100644 --- a/lib/include/srsran/adt/circular_buffer.h +++ b/lib/include/srsran/adt/circular_buffer.h @@ -251,22 +251,29 @@ public: base_blocking_queue(PushingFunc push_func_, PoppingFunc pop_func_, Args&&... args) : circ_buffer(std::forward(args)...), push_func(push_func_), pop_func(pop_func_) {} + base_blocking_queue(const base_blocking_queue&) = delete; + base_blocking_queue(base_blocking_queue&&) = delete; + base_blocking_queue& operator=(const base_blocking_queue&) = delete; + base_blocking_queue& operator=(base_blocking_queue&&) = delete; void stop() { std::unique_lock lock(mutex); if (active) { active = false; - if (nof_waiting == 0) { - return; + if (nof_waiting > 0) { + // Stop pending pushing/popping threads + do { + lock.unlock(); + cvar_empty.notify_all(); + cvar_full.notify_all(); + std::this_thread::yield(); + lock.lock(); + } while (nof_waiting > 0); } - do { - lock.unlock(); - cvar_empty.notify_all(); - cvar_full.notify_all(); - std::this_thread::yield(); - lock.lock(); - } while (nof_waiting > 0); + + // Empty queue + circ_buffer.clear(); } } @@ -284,8 +291,7 @@ public: bool pop_wait_until(T& obj, const std::chrono::system_clock::time_point& until) { return pop_(obj, true, &until); } void clear() { - std::lock_guard lock(mutex); - T obj; + T obj; while (pop_(obj, false)) { } } diff --git a/lib/test/adt/mem_pool_test.cc b/lib/test/adt/mem_pool_test.cc index 05c9849b5..1b6d91acb 100644 --- a/lib/test/adt/mem_pool_test.cc +++ b/lib/test/adt/mem_pool_test.cc @@ -115,6 +115,7 @@ void test_fixedsize_pool() fixed_pool->print_all_buffers(); } fixed_pool->print_all_buffers(); + TESTASSERT(C::default_ctor_counter == C::dtor_counter); // TEST: one thread allocates, and the other deallocates {