diff --git a/src/libs/compat/freebsd_network/compat/sys/taskqueue.h b/src/libs/compat/freebsd_network/compat/sys/taskqueue.h index 2767b321c7..f8d5c7363e 100644 --- a/src/libs/compat/freebsd_network/compat/sys/taskqueue.h +++ b/src/libs/compat/freebsd_network/compat/sys/taskqueue.h @@ -32,6 +32,7 @@ void taskqueue_free(struct taskqueue *tq); void taskqueue_drain(struct taskqueue *tq, struct task *task); void taskqueue_drain_timeout(struct taskqueue *queue, struct timeout_task *timeout_task); +void taskqueue_drain_all(struct taskqueue *tq); void taskqueue_block(struct taskqueue *queue); void taskqueue_unblock(struct taskqueue *queue); int taskqueue_enqueue(struct taskqueue *tq, struct task *task); diff --git a/src/libs/compat/freebsd_network/taskqueue.c b/src/libs/compat/freebsd_network/taskqueue.c index 33826a8ad4..01dfdb918e 100644 --- a/src/libs/compat/freebsd_network/taskqueue.c +++ b/src/libs/compat/freebsd_network/taskqueue.c @@ -293,6 +293,28 @@ taskqueue_drain_timeout(struct taskqueue *queue, } +static void +taskqueue_task_nop_fn(void* context, int pending) +{ +} + + +void +taskqueue_drain_all(struct taskqueue *taskQueue) +{ + struct task t_barrier; + + if (taskQueue == NULL) { + printf("taskqueue_drain_all called with NULL taskqueue\n"); + return; + } + + TASK_INIT(&t_barrier, USHRT_MAX, taskqueue_task_nop_fn, &t_barrier); + taskqueue_enqueue(taskQueue, &t_barrier); + taskqueue_drain(taskQueue, &t_barrier); +} + + static void taskqueue_enqueue_locked(struct taskqueue *taskQueue, struct task *task, cpu_status status)