summaryrefslogtreecommitdiffstats
path: root/sys/kern/subr_taskqueue.c
diff options
context:
space:
mode:
authorimp <imp@FreeBSD.org>2004-10-05 04:16:01 +0000
committerimp <imp@FreeBSD.org>2004-10-05 04:16:01 +0000
commitcf32c9fe798d693c410e887bc556f34a7bead347 (patch)
treead9188e83f96f6272ded257087c644b20048745e /sys/kern/subr_taskqueue.c
parent4a0945bc22b3ab2778127bb3beacf1fd455ac628 (diff)
downloadFreeBSD-src-cf32c9fe798d693c410e887bc556f34a7bead347.zip
FreeBSD-src-cf32c9fe798d693c410e887bc556f34a7bead347.tar.gz
Add taskqueue_drain. This waits for the specified task to finish, if
running, or returns. The calling program is responsible for making sure that nothing new is enqueued. # man page coming soon.
Diffstat (limited to 'sys/kern/subr_taskqueue.c')
-rw-r--r--sys/kern/subr_taskqueue.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/sys/kern/subr_taskqueue.c b/sys/kern/subr_taskqueue.c
index a10e710..7758fbd 100644
--- a/sys/kern/subr_taskqueue.c
+++ b/sys/kern/subr_taskqueue.c
@@ -186,11 +186,14 @@ taskqueue_run(struct taskqueue *queue)
STAILQ_REMOVE_HEAD(&queue->tq_queue, ta_link);
pending = task->ta_pending;
task->ta_pending = 0;
+ task->ta_flags |= TAF_PENDING;
mtx_unlock(&queue->tq_mutex);
task->ta_func(task->ta_context, pending);
mtx_lock(&queue->tq_mutex);
+ task->ta_flags &= ~TAF_PENDING;
+ wakeup(task);
}
/*
@@ -201,6 +204,17 @@ taskqueue_run(struct taskqueue *queue)
mtx_unlock(&queue->tq_mutex);
}
+void
+taskqueue_drain(struct taskqueue *queue, struct task *task)
+{
+ WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL, "taskqueue_drain");
+ mtx_lock(&queue->tq_mutex);
+ while (task->ta_pending != 0 || (task->ta_flags & TAF_PENDING)) {
+ msleep(task, &queue->tq_mutex, PWAIT, "-", 0);
+ }
+ mtx_unlock(&queue->tq_mutex);
+}
+
static void
taskqueue_swi_enqueue(void *context)
{
OpenPOWER on IntegriCloud