|TASK_ADD(9)||Kernel Developer's Manual||TASK_ADD(9)|
TASK_INITIALIZER — task
struct taskq *
char *name, unsigned int
task *t, void (*fn)(void
*, void *), void
taskq *tq, struct task
taskq *tq, struct task
extern struct taskq *const systq;
extern struct taskq *const systqmp;
(*fn)(void *, void *),
The taskq API provides a mechanism to defer work to a process context.
allocates a taskq and a set of threads to be used to complete work that
would be inappropriate for the shared system taskq. The
name argument specifies the name of the kernel threads
that are created to service the work on the taskq.
nthreads specifies the number of threads that will be
created to handle the work. ipl specifies the highest
interrupt protection level at which
task_del() will be called against the created taskq.
See spl(9) for a list of the
causes the resources associated with a previously created taskq to be freed.
It will wait till all the tasks in the work queue are completed before
taskq_destroy() against the
system taskq is an error and will lead to undefined behaviour or a system
It is the responsibility of the caller to provide
functions with pre-allocated task structures.
prepares the task structure t to be used in future
task_del(). t will be prepared
to call the function fn with the arguments specified
by arg1 and arg2. Once
initialised, the t structure can be used repeatedly in
task_del() and does not need to be reinitialised
unless the function called and/or its argument must change.
schedules the execution of the work specified by the task structure
t on the tq taskq. The task
structure must already be initialised by
will remove the task structure t from the taskq
tq. If the work was already executed or has not been
added to the taskq, the call will have no effect. Calling
task_del() against a different taskq than the one
given in a previous call to
task_add() is an error
and will lead to undefined behaviour.
The kernel provides two system taskqs: systq, which executes while holding the kernel lock, and systqmp, which does not hold the kernel lock during execution. They can both be used by any subsystem for short lived tasks. They are serviced by a single thread and can therefore provide predictable ordering of work. Work can be scheduled on the system taskqs from callers at or below IPL_HIGH.
A task declaration can be initialised with
macro. The task will be prepared to call the function specified by the
fn argument with the void *
arguments given in arg1 and
taskq_destroy() can be called during autoconf, or
from process context.
can be called during autoconf, from process context, or from interrupt
taskq_create() returns a pointer to a
taskq structure on success or
NULL on failure.
task_add() will return 1 if the task
t was added to the taskq tq or 0
if the task was already queued.
task_del() will return 1 if the task
t was removed from the taskq tq
or 0 if the task was not already on the queue.
The task API was originally written by David Gwynne <firstname.lastname@example.org>. The task API first appeared in OpenBSD 5.5.
|June 11, 2014||OpenBSD-5.6|