| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* | 
|  | 2 | * workqueue.h --- work queue handling for Linux. | 
|  | 3 | */ | 
|  | 4 |  | 
|  | 5 | #ifndef _LINUX_WORKQUEUE_H | 
|  | 6 | #define _LINUX_WORKQUEUE_H | 
|  | 7 |  | 
|  | 8 | #include <linux/timer.h> | 
|  | 9 | #include <linux/linkage.h> | 
|  | 10 | #include <linux/bitops.h> | 
|  | 11 |  | 
|  | 12 | struct workqueue_struct; | 
|  | 13 |  | 
|  | 14 | struct work_struct { | 
|  | 15 | unsigned long pending; | 
|  | 16 | struct list_head entry; | 
|  | 17 | void (*func)(void *); | 
|  | 18 | void *data; | 
|  | 19 | void *wq_data; | 
|  | 20 | struct timer_list timer; | 
|  | 21 | }; | 
|  | 22 |  | 
|  | 23 | #define __WORK_INITIALIZER(n, f, d) {				\ | 
|  | 24 | .entry	= { &(n).entry, &(n).entry },			\ | 
|  | 25 | .func = (f),						\ | 
|  | 26 | .data = (d),						\ | 
|  | 27 | .timer = TIMER_INITIALIZER(NULL, 0, 0),			\ | 
|  | 28 | } | 
|  | 29 |  | 
|  | 30 | #define DECLARE_WORK(n, f, d)					\ | 
|  | 31 | struct work_struct n = __WORK_INITIALIZER(n, f, d) | 
|  | 32 |  | 
|  | 33 | /* | 
|  | 34 | * initialize a work-struct's func and data pointers: | 
|  | 35 | */ | 
|  | 36 | #define PREPARE_WORK(_work, _func, _data)			\ | 
|  | 37 | do {							\ | 
|  | 38 | (_work)->func = _func;				\ | 
|  | 39 | (_work)->data = _data;				\ | 
|  | 40 | } while (0) | 
|  | 41 |  | 
|  | 42 | /* | 
|  | 43 | * initialize all of a work-struct: | 
|  | 44 | */ | 
|  | 45 | #define INIT_WORK(_work, _func, _data)				\ | 
|  | 46 | do {							\ | 
|  | 47 | INIT_LIST_HEAD(&(_work)->entry);		\ | 
|  | 48 | (_work)->pending = 0;				\ | 
|  | 49 | PREPARE_WORK((_work), (_func), (_data));	\ | 
|  | 50 | init_timer(&(_work)->timer);			\ | 
|  | 51 | } while (0) | 
|  | 52 |  | 
|  | 53 | extern struct workqueue_struct *__create_workqueue(const char *name, | 
|  | 54 | int singlethread); | 
|  | 55 | #define create_workqueue(name) __create_workqueue((name), 0) | 
|  | 56 | #define create_singlethread_workqueue(name) __create_workqueue((name), 1) | 
|  | 57 |  | 
|  | 58 | extern void destroy_workqueue(struct workqueue_struct *wq); | 
|  | 59 |  | 
|  | 60 | extern int FASTCALL(queue_work(struct workqueue_struct *wq, struct work_struct *work)); | 
|  | 61 | extern int FASTCALL(queue_delayed_work(struct workqueue_struct *wq, struct work_struct *work, unsigned long delay)); | 
|  | 62 | extern void FASTCALL(flush_workqueue(struct workqueue_struct *wq)); | 
|  | 63 |  | 
|  | 64 | extern int FASTCALL(schedule_work(struct work_struct *work)); | 
|  | 65 | extern int FASTCALL(schedule_delayed_work(struct work_struct *work, unsigned long delay)); | 
|  | 66 |  | 
|  | 67 | extern int schedule_delayed_work_on(int cpu, struct work_struct *work, unsigned long delay); | 
|  | 68 | extern void flush_scheduled_work(void); | 
|  | 69 | extern int current_is_keventd(void); | 
|  | 70 | extern int keventd_up(void); | 
|  | 71 |  | 
|  | 72 | extern void init_workqueues(void); | 
|  | 73 | void cancel_rearming_delayed_work(struct work_struct *work); | 
| James Bottomley | 81ddef7 | 2005-04-16 15:23:59 -0700 | [diff] [blame] | 74 | void cancel_rearming_delayed_workqueue(struct workqueue_struct *, | 
|  | 75 | struct work_struct *); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 76 |  | 
|  | 77 | /* | 
|  | 78 | * Kill off a pending schedule_delayed_work().  Note that the work callback | 
|  | 79 | * function may still be running on return from cancel_delayed_work().  Run | 
|  | 80 | * flush_scheduled_work() to wait on it. | 
|  | 81 | */ | 
|  | 82 | static inline int cancel_delayed_work(struct work_struct *work) | 
|  | 83 | { | 
|  | 84 | int ret; | 
|  | 85 |  | 
|  | 86 | ret = del_timer_sync(&work->timer); | 
|  | 87 | if (ret) | 
|  | 88 | clear_bit(0, &work->pending); | 
|  | 89 | return ret; | 
|  | 90 | } | 
|  | 91 |  | 
|  | 92 | #endif |