From ac56a9e79f71ec286228c5687475b1d79b702412 Mon Sep 17 00:00:00 2001 From: Sebastian Ullrich Date: Fri, 4 Sep 2020 16:38:25 +0200 Subject: [PATCH] fix: run tasks to completion on task_manager shutdown to prevent leaks --- src/runtime/object.cpp | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/src/runtime/object.cpp b/src/runtime/object.cpp index a85899f196..30653b042e 100644 --- a/src/runtime/object.cpp +++ b/src/runtime/object.cpp @@ -685,7 +685,7 @@ class task_manager { m_max_prio = prio; m_queues[prio].push_back(t); m_queues_size++; - if (m_workers_to_be_created > 0) + if (m_workers_to_be_created > 0 && !m_shutting_down) spawn_worker(); else m_queue_cv.notify_one(); @@ -718,11 +718,10 @@ class task_manager { save_stack_info(false); unique_lock lock(m_mutex); while (true) { - if (m_shutting_down) { - break; - } - if (m_queues_size == 0) { + if (m_shutting_down) { + break; + } m_queue_cv.wait(lock); continue; } @@ -802,26 +801,15 @@ public: } ~task_manager() { - unique_lock lock(m_mutex); - for (worker_info * info : m_workers) { - if (info->m_task) { - lean_assert(info->m_task->m_imp); - info->m_task->m_imp->m_canceled = true; - } + { + unique_lock lock(m_mutex); + m_shutting_down = true; } - m_shutting_down = true; m_queue_cv.notify_all(); - lock.unlock(); for (worker_info * w : m_workers) { w->m_thread->join(); delete w; } - for (std::deque const & q : m_queues) { - for (lean_task_object * o : q) { - lean_assert(o->m_imp && o->m_imp->m_deleted); - free_task(o); - } - } } void enqueue(lean_task_object * t) {