+1 Very useful :)
-a On 9 October 2013 01:55, Andriy Gapon <a...@freebsd.org> wrote: > > I would like to propose to extend taskqueue API with taskqueue_drain_all. > A potential use case: I have a private taskqueue, several kinds of tasks > get > executed via it and then I want to make sure that all of them are > completed. > Obviously, I have a way to ensure that no new ones get enqueued. > > Is this a good addition? > Or should like consider looping over all of my tasks externally to > taskqueue > implementation? > > A quick prototype: > > --- a/sys/kern/subr_taskqueue.c > +++ b/sys/kern/subr_taskqueue.c > @@ -316,6 +316,7 @@ taskqueue_run_locked(struct taskqueue *queue) > wakeup(task); > } > TAILQ_REMOVE(&queue->tq_active, &tb, tb_link); > + wakeup(&queue->tq_active); > } > > void > @@ -402,6 +403,22 @@ taskqueue_drain(struct taskqueue *queue, struct task > *task) > } > > void > +taskqueue_drain_all(struct taskqueue *queue) > +{ > + struct task *task; > + > + TQ_LOCK(queue); > + while ((task = STAILQ_FIRST(&queue->tq_queue)) != NULL) { > + while (task->ta_pending != 0 || task_is_running(queue, > task)) > + TQ_SLEEP(queue, task, &queue->tq_mutex, PWAIT, > "-", 0); > + } > + while (TAILQ_FIRST(&queue->tq_active) != NULL) > + TQ_SLEEP(queue, &queue->tq_active, > + &queue->tq_mutex, PWAIT, "-", 0); > + TQ_UNLOCK(queue); > +} > + > +void > taskqueue_drain_timeout(struct taskqueue *queue, > struct timeout_task *timeout_task) > { > > > -- > Andriy Gapon > > _______________________________________________ > freebsd-hackers@freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-hackers > To unsubscribe, send any mail to "freebsd-hackers-unsubscr...@freebsd.org" > _______________________________________________ freebsd-hackers@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-hackers To unsubscribe, send any mail to "freebsd-hackers-unsubscr...@freebsd.org"