taskqueue.h revision 61033
1/*-
2 * Copyright (c) 2000 Doug Rabson
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
26 *	$FreeBSD: head/sys/sys/taskqueue.h 61033 2000-05-28 15:45:30Z dfr $
27 */
28
29#ifndef _SYS_TASKQUEUE_H_
30#define _SYS_TASKQUEUE_H_
31
32#ifdef _KERNEL
33
34struct taskqueue;
35
36/*
37 * Each task includes a function which is called from
38 * taskqueue_run(). The first argument is taken from the 'ta_context'
39 * field of struct task and the second argument is a count of how many
40 * times the task was enqueued before the call to taskqueue_run().
41 */
42typedef void (*task_fn)(void *context, int pending);
43
44/*
45 * A notification callback function which is called from
46 * taskqueue_enqueue(). The context argument is given in the call to
47 * taskqueue_create(). This function would normally be used to allow the
48 * queue to arrange to run itself later (e.g. by scheduling a software
49 * interrupt or waking a kernel thread).
50 */
51typedef void (*taskqueue_enqueue_fn)(void *context);
52
53struct task {
54	STAILQ_ENTRY(task)	ta_link;	/* link for queue */
55	int			ta_pending;	/* count times queued */
56	int			ta_priority;	/* priority of task in queue */
57	task_fn			ta_func;	/* task handler */
58	void			*ta_context;	/* argument for handler */
59};
60
61struct taskqueue	*taskqueue_create(const char *name, int mflags,
62					  taskqueue_enqueue_fn enqueue,
63					  void *context);
64void			taskqueue_free(struct taskqueue *queue);
65struct taskqueue	*taskqueue_find(const char *name);
66int			taskqueue_enqueue(struct taskqueue *queue,
67					  struct task *task);
68void			taskqueue_run(struct taskqueue *queue);
69
70/*
71 * Initialise a task structure.
72 */
73#define TASK_INIT(task, priority, func, context) do {	\
74    task->ta_pending = 0;				\
75    task->ta_priority = priority;			\
76    task->ta_func = func;				\
77    task->ta_context = context;				\
78} while (0)
79
80/*
81 * Declare a reference to a taskqueue.
82 */
83#define TASKQUEUE_DECLARE(name)			\
84						\
85extern struct taskqueue *taskqueue_##name
86
87/*
88 * Define and initialise a taskqueue.
89 */
90#define TASKQUEUE_DEFINE(name, enqueue, context, init)		\
91									\
92struct taskqueue *taskqueue_##name;					\
93									\
94static void								\
95taskqueue_define_##name(void *arg)					\
96{									\
97	taskqueue_##name =						\
98		taskqueue_create(#name, M_NOWAIT, enqueue, context);	\
99	init;								\
100}									\
101									\
102SYSINIT(taskqueue_##name, SI_SUB_CONFIGURE, SI_ORDER_SECOND,		\
103	taskqueue_define_##name, NULL);
104
105/*
106 * This queue is serviced by a software interrupt handler. To enqueue
107 * a task, call taskqueue_enqueue(&taskqueue_swi, &task).
108 */
109TASKQUEUE_DECLARE(swi);
110
111#endif /* _KERNEL */
112
113#endif /* !_SYS_TASKQUEUE_H_ */
114