summaryrefslogtreecommitdiffstats
path: root/sys/kern/subr_taskqueue.c
diff options
context:
space:
mode:
authormdf <mdf@FreeBSD.org>2010-11-08 20:56:31 +0000
committermdf <mdf@FreeBSD.org>2010-11-08 20:56:31 +0000
commitccbc087adcaa5186934ad911d3211084206d74b7 (patch)
tree899d8e0d6f17680a9b78254843161a1ae057db95 /sys/kern/subr_taskqueue.c
parenta7f4df4adcea44a13eeff6b3875d05d1b421d80c (diff)
downloadFreeBSD-src-ccbc087adcaa5186934ad911d3211084206d74b7.zip
FreeBSD-src-ccbc087adcaa5186934ad911d3211084206d74b7.tar.gz
Add a taskqueue_cancel(9) to cancel a pending task without waiting for
it to run as taskqueue_drain(9) does. Requested by: hselasky Original code: jeff Reviewed by: jhb MFC after: 2 weeks
Diffstat (limited to 'sys/kern/subr_taskqueue.c')
-rw-r--r--sys/kern/subr_taskqueue.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/sys/kern/subr_taskqueue.c b/sys/kern/subr_taskqueue.c
index fd6dd4f..d31d668 100644
--- a/sys/kern/subr_taskqueue.c
+++ b/sys/kern/subr_taskqueue.c
@@ -275,6 +275,24 @@ task_is_running(struct taskqueue *queue, struct task *task)
return (0);
}
+int
+taskqueue_cancel(struct taskqueue *queue, struct task *task, u_int *pendp)
+{
+ u_int pending;
+ int error;
+
+ TQ_LOCK(queue);
+ if ((pending = task->ta_pending) > 0)
+ STAILQ_REMOVE(&queue->tq_queue, task, task, ta_link);
+ task->ta_pending = 0;
+ error = task_is_running(queue, task) ? EBUSY : 0;
+ TQ_UNLOCK(queue);
+
+ if (pendp != NULL)
+ *pendp = pending;
+ return (error);
+}
+
void
taskqueue_drain(struct taskqueue *queue, struct task *task)
{
OpenPOWER on IntegriCloud