Deleted Added
full compact
taskqueue.h (61033) taskqueue.h (61086)
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 unchanged lines hidden (view full) ---

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 *
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 unchanged lines hidden (view full) ---

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 $
26 * $FreeBSD: head/sys/sys/taskqueue.h 61086 2000-05-30 07:27:46Z dfr $
27 */
28
29#ifndef _SYS_TASKQUEUE_H_
30#define _SYS_TASKQUEUE_H_
31
27 */
28
29#ifndef _SYS_TASKQUEUE_H_
30#define _SYS_TASKQUEUE_H_
31
32#ifdef _KERNEL
32#ifndef _KERNEL
33#error "no user-servicable parts inside"
34#endif
33
35
36#include <sys/queue.h>
37
34struct taskqueue;
35
36/*
37 * Each task includes a function which is called from
38struct taskqueue;
39
40/*
41 * Each task includes a function which is called from
38 * taskqueue_run(). The first argument is taken from the 'ta_context'
42 * 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 */
43 * field of struct task and the second argument is a count of how many
44 * times the task was enqueued before the call to taskqueue_run().
45 */
42typedef void (*task_fn)(void *context, int pending);
46typedef void task_fn_t(void *context, int pending);
43
44/*
45 * A notification callback function which is called from
47
48/*
49 * 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
50 * taskqueue_enqueue(). The context argument is given in the call to
51 * taskqueue_create(). This function would normally be used to allow the
52 * 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 {
53 * interrupt or waking a kernel thread).
54 */
55typedef void (*taskqueue_enqueue_fn)(void *context);
56
57struct 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 */
58 STAILQ_ENTRY(task) ta_link; /* link for queue */
59 int ta_pending; /* count times queued */
60 int ta_priority; /* priority of task in queue */
61 task_fn_t *ta_func; /* task handler */
62 void *ta_context; /* argument for handler */
59};
60
63};
64
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);
65struct taskqueue *taskqueue_create(const char *name, int mflags,
66 taskqueue_enqueue_fn enqueue,
67 void *context);
68int taskqueue_enqueue(struct taskqueue *queue, struct task *task);
69struct taskqueue *taskqueue_find(const char *name);
70void taskqueue_free(struct taskqueue *queue);
71void taskqueue_run(struct taskqueue *queue);
69
70/*
71 * Initialise a task structure.
72 */
73#define TASK_INIT(task, priority, func, context) do { \
72
73/*
74 * Initialise a task structure.
75 */
76#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; \
77 (task)->ta_pending = 0; \
78 (task)->ta_priority = (priority); \
79 (task)->ta_func = (func); \
80 (task)->ta_context = (context); \
78} while (0)
79
80/*
81 * Declare a reference to a taskqueue.
82 */
83#define TASKQUEUE_DECLARE(name) \
81} while (0)
82
83/*
84 * Declare a reference to a taskqueue.
85 */
86#define TASKQUEUE_DECLARE(name) \
84 \
85extern struct taskqueue *taskqueue_##name
86
87/*
88 * Define and initialise a taskqueue.
89 */
87extern struct taskqueue *taskqueue_##name
88
89/*
90 * Define and initialise a taskqueue.
91 */
90#define TASKQUEUE_DEFINE(name, enqueue, context, init) \
92#define TASKQUEUE_DEFINE(name, enqueue, context, init) \
91 \
92struct taskqueue *taskqueue_##name; \
93 \
94static void \
95taskqueue_define_##name(void *arg) \
96{ \
97 taskqueue_##name = \
93 \
94struct taskqueue *taskqueue_##name; \
95 \
96static void \
97taskqueue_define_##name(void *arg) \
98{ \
99 taskqueue_##name = \
98 taskqueue_create(#name, M_NOWAIT, enqueue, context); \
100 taskqueue_create(#name, M_NOWAIT, (enqueue), (context)); \
99 init; \
100} \
101 \
102SYSINIT(taskqueue_##name, SI_SUB_CONFIGURE, SI_ORDER_SECOND, \
101 init; \
102} \
103 \
104SYSINIT(taskqueue_##name, SI_SUB_CONFIGURE, SI_ORDER_SECOND, \
103 taskqueue_define_##name, NULL);
105 taskqueue_define_##name, NULL) \
106 \
107struct __hack
104
105/*
108
109/*
106 * This queue is serviced by a software interrupt handler. To enqueue
110 * 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 * a task, call taskqueue_enqueue(&taskqueue_swi, &task).
112 */
113TASKQUEUE_DECLARE(swi);
114
111#endif /* _KERNEL */
112
113#endif /* !_SYS_TASKQUEUE_H_ */
115#endif /* !_SYS_TASKQUEUE_H_ */