diff options
| author | Garrett D'Amore <garrett@damore.org> | 2018-05-17 20:41:06 -0700 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2018-05-17 21:52:07 -0700 |
| commit | 846c30081a67e961b4a060bdca192ddafb87cce9 (patch) | |
| tree | c795cd6241979418f651c2e2d5e42091988591d6 /src/core/taskq.c | |
| parent | 109a559590abfe3017dd317c3068e2457188541c (diff) | |
| download | nng-846c30081a67e961b4a060bdca192ddafb87cce9.tar.gz nng-846c30081a67e961b4a060bdca192ddafb87cce9.tar.bz2 nng-846c30081a67e961b4a060bdca192ddafb87cce9.zip | |
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.
Diffstat (limited to 'src/core/taskq.c')
| -rw-r--r-- | src/core/taskq.c | 22 |
1 files changed, 2 insertions, 20 deletions
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); |
