svn commit: r258713 - in head/sys: kern sys
Justin T. Gibbs
gibbs at scsiguy.com
Sat Nov 30 06:46:05 UTC 2013
Man page update?
—
Justin
On Nov 28, 2013, at 11:56 AM, Andriy Gapon <avg at FreeBSD.org> wrote:
> Author: avg
> Date: Thu Nov 28 18:56:34 2013
> New Revision: 258713
> URL: http://svnweb.freebsd.org/changeset/base/258713
>
> Log:
> add taskqueue_drain_all
>
> This API has semantics similar to that of taskqueue_drain but acts on
> all tasks that might be queued or running on a taskqueue.
> A caller must ensure that no new tasks are being enqueued otherwise this
> call would be totally meaningless. For example, if the tasks are
> enqueued by an interrupt filter then its interrupt must be disabled.
>
> MFC after: 10 days
>
> Modified:
> head/sys/kern/subr_taskqueue.c
> head/sys/sys/taskqueue.h
>
> Modified: head/sys/kern/subr_taskqueue.c
> ==============================================================================
> --- head/sys/kern/subr_taskqueue.c Thu Nov 28 16:36:03 2013 (r258712)
> +++ head/sys/kern/subr_taskqueue.c Thu Nov 28 18:56:34 2013 (r258713)
> @@ -300,6 +300,15 @@ taskqueue_enqueue_timeout(struct taskque
> return (res);
> }
>
> +static void
> +taskqueue_drain_running(struct taskqueue *queue)
> +{
> +
> + while (!TAILQ_EMPTY(&queue->tq_active))
> + TQ_SLEEP(queue, &queue->tq_active, &queue->tq_mutex,
> + PWAIT, "-", 0);
> +}
> +
> void
> taskqueue_block(struct taskqueue *queue)
> {
> @@ -350,6 +359,8 @@ taskqueue_run_locked(struct taskqueue *q
> wakeup(task);
> }
> TAILQ_REMOVE(&queue->tq_active, &tb, tb_link);
> + if (TAILQ_EMPTY(&queue->tq_active))
> + wakeup(&queue->tq_active);
> }
>
> void
> @@ -434,6 +445,25 @@ taskqueue_drain(struct taskqueue *queue,
> }
>
> void
> +taskqueue_drain_all(struct taskqueue *queue)
> +{
> + struct task *task;
> +
> + if (!queue->tq_spin)
> + WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL, __func__);
> +
> + TQ_LOCK(queue);
> + task = STAILQ_LAST(&queue->tq_queue, task, ta_link);
> + if (task != NULL)
> + while (task->ta_pending != 0)
> + TQ_SLEEP(queue, task, &queue->tq_mutex, PWAIT, "-", 0);
> + taskqueue_drain_running(queue);
> + KASSERT(STAILQ_EMPTY(&queue->tq_queue),
> + ("taskqueue queue is not empty after draining"));
> + TQ_UNLOCK(queue);
> +}
> +
> +void
> taskqueue_drain_timeout(struct taskqueue *queue,
> struct timeout_task *timeout_task)
> {
>
> Modified: head/sys/sys/taskqueue.h
> ==============================================================================
> --- head/sys/sys/taskqueue.h Thu Nov 28 16:36:03 2013 (r258712)
> +++ head/sys/sys/taskqueue.h Thu Nov 28 18:56:34 2013 (r258713)
> @@ -81,6 +81,7 @@ int taskqueue_cancel_timeout(struct task
> void taskqueue_drain(struct taskqueue *queue, struct task *task);
> void taskqueue_drain_timeout(struct taskqueue *queue,
> struct timeout_task *timeout_task);
> +void taskqueue_drain_all(struct taskqueue *queue);
> void taskqueue_free(struct taskqueue *queue);
> void taskqueue_run(struct taskqueue *queue);
> void taskqueue_block(struct taskqueue *queue);
>
More information about the svn-src-all
mailing list