aboutsummaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2018-05-17 20:41:06 -0700
committerGarrett D'Amore <garrett@damore.org>2018-05-17 21:52:07 -0700
commit846c30081a67e961b4a060bdca192ddafb87cce9 (patch)
treec795cd6241979418f651c2e2d5e42091988591d6 /src/core
parent109a559590abfe3017dd317c3068e2457188541c (diff)
downloadnng-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')
-rw-r--r--src/core/taskq.c22
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);