diff options
author | zml <zml@FreeBSD.org> | 2010-06-01 16:04:01 +0000 |
---|---|---|
committer | zml <zml@FreeBSD.org> | 2010-06-01 16:04:01 +0000 |
commit | 7f5d6a35d6fa3ee4e0f0629aa54dbe3c7549b664 (patch) | |
tree | 800e1d5d39c5d5001f0b0a56fa9d521ea7616317 /sys/kern/subr_taskqueue.c | |
parent | ab54fd079f3a491799640409cffd4fd999b59303 (diff) | |
download | FreeBSD-src-7f5d6a35d6fa3ee4e0f0629aa54dbe3c7549b664.zip FreeBSD-src-7f5d6a35d6fa3ee4e0f0629aa54dbe3c7549b664.tar.gz |
Revert taskqueue(9) related commits until mdf@ is approved and can
resolve issues.
This reverts commits r207439, r208623, r208624
Diffstat (limited to 'sys/kern/subr_taskqueue.c')
-rw-r--r-- | sys/kern/subr_taskqueue.c | 20 |
1 files changed, 6 insertions, 14 deletions
diff --git a/sys/kern/subr_taskqueue.c b/sys/kern/subr_taskqueue.c index b06678c..8405b3d 100644 --- a/sys/kern/subr_taskqueue.c +++ b/sys/kern/subr_taskqueue.c @@ -51,13 +51,12 @@ struct taskqueue { const char *tq_name; taskqueue_enqueue_fn tq_enqueue; void *tq_context; + struct task *tq_running; struct mtx tq_mutex; struct thread **tq_threads; int tq_tcount; int tq_spin; int tq_flags; - int tq_tasks_running; - int tq_task_waiters; }; #define TQ_FLAGS_ACTIVE (1 << 0) @@ -234,15 +233,14 @@ taskqueue_run(struct taskqueue *queue) STAILQ_REMOVE_HEAD(&queue->tq_queue, ta_link); pending = task->ta_pending; task->ta_pending = 0; - queue->tq_tasks_running++; + queue->tq_running = task; TQ_UNLOCK(queue); task->ta_func(task->ta_context, pending); TQ_LOCK(queue); - queue->tq_tasks_running--; - if (queue->tq_task_waiters > 0) - wakeup(task); + queue->tq_running = NULL; + wakeup(task); } /* @@ -258,21 +256,15 @@ taskqueue_drain(struct taskqueue *queue, struct task *task) { if (queue->tq_spin) { /* XXX */ mtx_lock_spin(&queue->tq_mutex); - while (task->ta_pending != 0 || queue->tq_tasks_running > 0) { - queue->tq_task_waiters++; + while (task->ta_pending != 0 || task == queue->tq_running) msleep_spin(task, &queue->tq_mutex, "-", 0); - queue->tq_task_waiters--; - } mtx_unlock_spin(&queue->tq_mutex); } else { WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL, __func__); mtx_lock(&queue->tq_mutex); - while (task->ta_pending != 0 || queue->tq_tasks_running > 0) { - queue->tq_task_waiters++; + while (task->ta_pending != 0 || task == queue->tq_running) msleep(task, &queue->tq_mutex, PWAIT, "-", 0); - queue->tq_task_waiters--; - } mtx_unlock(&queue->tq_mutex); } } |