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_ */ |