at v2.6.16-rc6 2.7 kB view raw
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 12struct workqueue_struct; 13 14struct 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 53extern 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 58extern void destroy_workqueue(struct workqueue_struct *wq); 59 60extern int FASTCALL(queue_work(struct workqueue_struct *wq, struct work_struct *work)); 61extern int FASTCALL(queue_delayed_work(struct workqueue_struct *wq, struct work_struct *work, unsigned long delay)); 62extern void FASTCALL(flush_workqueue(struct workqueue_struct *wq)); 63 64extern int FASTCALL(schedule_work(struct work_struct *work)); 65extern int FASTCALL(schedule_delayed_work(struct work_struct *work, unsigned long delay)); 66 67extern int schedule_delayed_work_on(int cpu, struct work_struct *work, unsigned long delay); 68extern int schedule_on_each_cpu(void (*func)(void *info), void *info); 69extern void flush_scheduled_work(void); 70extern int current_is_keventd(void); 71extern int keventd_up(void); 72 73extern void init_workqueues(void); 74void cancel_rearming_delayed_work(struct work_struct *work); 75void cancel_rearming_delayed_workqueue(struct workqueue_struct *, 76 struct work_struct *); 77 78/* 79 * Kill off a pending schedule_delayed_work(). Note that the work callback 80 * function may still be running on return from cancel_delayed_work(). Run 81 * flush_scheduled_work() to wait on it. 82 */ 83static inline int cancel_delayed_work(struct work_struct *work) 84{ 85 int ret; 86 87 ret = del_timer_sync(&work->timer); 88 if (ret) 89 clear_bit(0, &work->pending); 90 return ret; 91} 92 93#endif