Print this page
9017 Introduce taskq_empty()
Reviewed by: Bryan Cantrill <bryan@joyent.com>
Reviewed by: Dan McDonald <danmcd@joyent.com>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: Yuri Pankov <yuripv@yuripv.net>

@@ -24,10 +24,11 @@
  */
 
 /*
  * Copyright 2015 Nexenta Systems, Inc.  All rights reserved.
  * Copyright (c) 2017 by Delphix. All rights reserved.
+ * Copyright 2018, Joyent, Inc.
  */
 
 /*
  * Kernel task queues: general-purpose asynchronous task scheduling.
  *

@@ -198,10 +199,14 @@
  *      taskqs.  The memory for the tqent must not be modified or used
  *      until the function (func) is called.  (However, func itself
  *      may safely modify or free this memory, once it is called.)
  *      Note that the taskq framework will NOT free this memory.
  *
+ * boolean_t taskq_empty(tq)
+ *
+ *      Queries if there are tasks pending on the queue.
+ *
  * void taskq_wait(tq):
  *
  *      Waits for all previously scheduled tasks to complete.
  *
  *      NOTE: It does not stop any new task dispatches.

@@ -1317,10 +1322,26 @@
                 TQ_ENQUEUE(tq, tqe, func, arg);
         }
         mutex_exit(&tq->tq_lock);
 }
 
+/*
+ * Allow our caller to ask if there are tasks pending on the queue.
+ */
+boolean_t
+taskq_empty(taskq_t *tq)
+{
+        boolean_t rv;
+
+        ASSERT3P(tq, !=, curthread->t_taskq);
+        mutex_enter(&tq->tq_lock);
+        rv = (tq->tq_task.tqent_next == &tq->tq_task) && (tq->tq_active == 0);
+        mutex_exit(&tq->tq_lock);
+
+        return (rv);
+}
+
 /*
  * Wait for all pending tasks to complete.
  * Calling taskq_wait from a task will cause deadlock.
  */
 void