Subversion Repositories Kolibri OS

Rev

Rev 4125 | Rev 5272 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  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/list.h>
  9. #include <linux/linkage.h>
  10. #include <linux/lockdep.h>
  11. #include <linux/threads.h>
  12.  
  13. #include <syscall.h>
  14. struct workqueue_struct;
  15.  
  16. struct work_struct;
  17. typedef void (*work_func_t)(struct work_struct *work);
  18. void __stdcall delayed_work_timer_fn(unsigned long __data);
  19.  
  20. /*
  21.  * Workqueue flags and constants.  For details, please refer to
  22.  * Documentation/workqueue.txt.
  23.  */
  24. enum {
  25.     WQ_NON_REENTRANT    = 1 << 0, /* guarantee non-reentrance */
  26.     WQ_UNBOUND          = 1 << 1, /* not bound to any cpu */
  27.     WQ_FREEZABLE        = 1 << 2, /* freeze during suspend */
  28.     WQ_MEM_RECLAIM      = 1 << 3, /* may be used for memory reclaim */
  29.     WQ_HIGHPRI          = 1 << 4, /* high priority */
  30.     WQ_CPU_INTENSIVE    = 1 << 5, /* cpu instensive workqueue */
  31.  
  32.     WQ_DRAINING         = 1 << 6, /* internal: workqueue is draining */
  33.     WQ_RESCUER          = 1 << 7, /* internal: workqueue has rescuer */
  34.  
  35.     WQ_MAX_ACTIVE       = 512,    /* I like 512, better ideas? */
  36.     WQ_MAX_UNBOUND_PER_CPU  = 4,      /* 4 * #cpus for unbound wq */
  37.     WQ_DFL_ACTIVE       = WQ_MAX_ACTIVE / 2,
  38. };
  39.  
  40.  
  41. struct workqueue_struct {
  42.     spinlock_t lock;
  43.     struct list_head worklist;
  44.     struct list_head delayed_worklist;
  45. };
  46.  
  47. struct work_struct {
  48.     struct list_head entry;
  49.     struct workqueue_struct *data;
  50.     work_func_t func;
  51. #ifdef CONFIG_LOCKDEP
  52.         struct lockdep_map lockdep_map;
  53. #endif
  54. };
  55.  
  56. struct delayed_work {
  57.     struct work_struct work;
  58.     unsigned int delay;
  59. };
  60.  
  61. static inline struct delayed_work *to_delayed_work(struct work_struct *work)
  62. {
  63.     return container_of(work, struct delayed_work, work);
  64. }
  65.  
  66. extern struct workqueue_struct *system_wq;
  67.  
  68. void run_workqueue(struct workqueue_struct *cwq);
  69.  
  70. struct workqueue_struct *alloc_workqueue_key(const char *fmt,
  71.                            unsigned int flags, int max_active);
  72.  
  73.  
  74. #define alloc_ordered_workqueue(fmt, flags, args...)            \
  75.         alloc_workqueue(fmt, WQ_UNBOUND | (flags), 1, ##args)
  76.  
  77. bool queue_work(struct workqueue_struct *wq, struct work_struct *work);
  78. int queue_delayed_work(struct workqueue_struct *wq,
  79.                         struct delayed_work *dwork, unsigned long delay);
  80.  
  81. bool schedule_delayed_work(struct delayed_work *dwork, unsigned long delay);
  82.  
  83.  
  84. #define INIT_WORK(_work, _func)                 \
  85.     do {                                        \
  86.         INIT_LIST_HEAD(&(_work)->entry);        \
  87.         (_work)->func = _func;                  \
  88.     } while (0)
  89.  
  90.  
  91. #define INIT_DELAYED_WORK(_work, _func)         \
  92.     do {                                        \
  93.         INIT_LIST_HEAD(&(_work)->work.entry);   \
  94.         (_work)->work.func = _func;             \
  95.     } while (0)
  96.  
  97. static inline bool schedule_work(struct work_struct *work)
  98. {
  99.     return queue_work(system_wq, work);
  100. }
  101.  
  102.  
  103. #endif  /*  _LINUX_WORKQUEUE_H  */
  104.