diff options
author | mdf <mdf@FreeBSD.org> | 2010-11-08 20:56:31 +0000 |
---|---|---|
committer | mdf <mdf@FreeBSD.org> | 2010-11-08 20:56:31 +0000 |
commit | ccbc087adcaa5186934ad911d3211084206d74b7 (patch) | |
tree | 899d8e0d6f17680a9b78254843161a1ae057db95 /sys/kern/subr_taskqueue.c | |
parent | a7f4df4adcea44a13eeff6b3875d05d1b421d80c (diff) | |
download | FreeBSD-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.c | 18 |
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) { |