taskqueue_drain_all

2013-10-09 Thread Andriy Gapon

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

Re: taskqueue_drain_all

2013-10-09 Thread Adrian Chadd
+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