From 846c30081a67e961b4a060bdca192ddafb87cce9 Mon Sep 17 00:00:00 2001 From: Garrett D'Amore Date: Thu, 17 May 2018 20:41:06 -0700 Subject: fixes #451 task finalization could be better/smarter (resolver) This changes nni_task_fini to always run synchronously, waiting for the task to finish before cleaning up. Much simpler code. Additionally, we've refactored the resolver code to avoid the use of taskqs, which added complexity and inefficiency. The approach of just allocating its own threads and a work queue to process them turns out to be vastly simpler, and actually reduces extra allocations and context switches. wip POSIX resolv threads. (Taskqs are just overhead and complexity here.) Windows resolver changes. Task cleanup. fix up windows mutex. --- src/core/taskq.c | 22 ++-------------------- 1 file changed, 2 insertions(+), 20 deletions(-) (limited to 'src/core') diff --git a/src/core/taskq.c b/src/core/taskq.c index 15351840..f0712e59 100644 --- a/src/core/taskq.c +++ b/src/core/taskq.c @@ -18,7 +18,6 @@ struct nni_task { nni_taskq * task_tq; unsigned task_busy; bool task_prep; - bool task_fini; nni_mtx task_mtx; nni_cv task_cv; }; @@ -56,14 +55,6 @@ nni_taskq_thread(void *self) nni_mtx_lock(&task->task_mtx); task->task_busy--; if (task->task_busy == 0) { - if (task->task_fini) { - task->task_fini = false; - nni_mtx_unlock(&task->task_mtx); - nni_task_fini(task); - - nni_mtx_lock(&tq->tq_mtx); - continue; - } nni_cv_wake(&task->task_cv); } nni_mtx_unlock(&task->task_mtx); @@ -158,12 +149,6 @@ nni_task_exec(nni_task *task) nni_mtx_lock(&task->task_mtx); task->task_busy--; if (task->task_busy == 0) { - if (task->task_fini) { - task->task_fini = false; - nni_mtx_unlock(&task->task_mtx); - nni_task_fini(task); - return; - } nni_cv_wake(&task->task_cv); } nni_mtx_unlock(&task->task_mtx); @@ -238,11 +223,8 @@ nni_task_fini(nni_task *task) { NNI_ASSERT(!nni_list_node_active(&task->task_node)); nni_mtx_lock(&task->task_mtx); - if (task->task_busy) { - // destroy later. - task->task_fini = true; - nni_mtx_unlock(&task->task_mtx); - return; + while (task->task_busy) { + nni_cv_wait(&task->task_cv); } nni_mtx_unlock(&task->task_mtx); nni_cv_fini(&task->task_cv); -- cgit v1.2.3-70-g09d2