linux/include/linux/workqueue.h
<<
>>
Prefs
   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 void flush_scheduled_work(void);
  69extern int current_is_keventd(void);
  70extern int keventd_up(void);
  71
  72extern void init_workqueues(void);
  73
  74/*
  75 * Kill off a pending schedule_delayed_work().  Note that the work callback
  76 * function may still be running on return from cancel_delayed_work().  Run
  77 * flush_scheduled_work() to wait on it.
  78 */
  79static inline int cancel_delayed_work(struct work_struct *work)
  80{
  81        int ret;
  82
  83        ret = del_timer_sync(&work->timer);
  84        if (ret)
  85                clear_bit(0, &work->pending);
  86        return ret;
  87}
  88
  89#endif
  90
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.