wait.h
上传用户:szlgq88
上传日期:2009-04-28
资源大小:48287k
文件大小:14k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. #ifndef _LINUX_WAIT_H
  2. #define _LINUX_WAIT_H
  3. #define WNOHANG 0x00000001
  4. #define WUNTRACED 0x00000002
  5. #define WSTOPPED WUNTRACED
  6. #define WEXITED 0x00000004
  7. #define WCONTINUED 0x00000008
  8. #define WNOWAIT 0x01000000 /* Don't reap, just poll status.  */
  9. #define __WNOTHREAD 0x20000000 /* Don't wait on children of other threads in this group */
  10. #define __WALL 0x40000000 /* Wait on all children, regardless of type */
  11. #define __WCLONE 0x80000000 /* Wait only on non-SIGCHLD children */
  12. /* First argument to waitid: */
  13. #define P_ALL 0
  14. #define P_PID 1
  15. #define P_PGID 2
  16. #ifdef __KERNEL__
  17. #include <linux/config.h>
  18. #include <linux/list.h>
  19. #include <linux/stddef.h>
  20. #include <linux/spinlock.h>
  21. #include <asm/system.h>
  22. #include <asm/current.h>
  23. typedef struct __wait_queue wait_queue_t;
  24. typedef int (*wait_queue_func_t)(wait_queue_t *wait, unsigned mode, int sync, void *key);
  25. int default_wake_function(wait_queue_t *wait, unsigned mode, int sync, void *key);
  26. struct __wait_queue {
  27. unsigned int flags;
  28. #define WQ_FLAG_EXCLUSIVE 0x01
  29. void *private;
  30. wait_queue_func_t func;
  31. struct list_head task_list;
  32. };
  33. struct wait_bit_key {
  34. void *flags;
  35. int bit_nr;
  36. };
  37. struct wait_bit_queue {
  38. struct wait_bit_key key;
  39. wait_queue_t wait;
  40. };
  41. struct __wait_queue_head {
  42. spinlock_t lock;
  43. struct list_head task_list;
  44. };
  45. typedef struct __wait_queue_head wait_queue_head_t;
  46. /*
  47.  * Macros for declaration and initialisaton of the datatypes
  48.  */
  49. #define __WAITQUEUE_INITIALIZER(name, tsk) {
  50. .private = tsk,
  51. .func = default_wake_function,
  52. .task_list = { NULL, NULL } }
  53. #define DECLARE_WAITQUEUE(name, tsk)
  54. wait_queue_t name = __WAITQUEUE_INITIALIZER(name, tsk)
  55. #define __WAIT_QUEUE_HEAD_INITIALIZER(name) {
  56. .lock = SPIN_LOCK_UNLOCKED,
  57. .task_list = { &(name).task_list, &(name).task_list } }
  58. #define DECLARE_WAIT_QUEUE_HEAD(name) 
  59. wait_queue_head_t name = __WAIT_QUEUE_HEAD_INITIALIZER(name)
  60. #define __WAIT_BIT_KEY_INITIALIZER(word, bit)
  61. { .flags = word, .bit_nr = bit, }
  62. static inline void init_waitqueue_head(wait_queue_head_t *q)
  63. {
  64. spin_lock_init(&q->lock);
  65. INIT_LIST_HEAD(&q->task_list);
  66. }
  67. static inline void init_waitqueue_entry(wait_queue_t *q, struct task_struct *p)
  68. {
  69. q->flags = 0;
  70. q->private = p;
  71. q->func = default_wake_function;
  72. }
  73. static inline void init_waitqueue_func_entry(wait_queue_t *q,
  74. wait_queue_func_t func)
  75. {
  76. q->flags = 0;
  77. q->private = NULL;
  78. q->func = func;
  79. }
  80. static inline int waitqueue_active(wait_queue_head_t *q)
  81. {
  82. return !list_empty(&q->task_list);
  83. }
  84. /*
  85.  * Used to distinguish between sync and async io wait context:
  86.  * sync i/o typically specifies a NULL wait queue entry or a wait
  87.  * queue entry bound to a task (current task) to wake up.
  88.  * aio specifies a wait queue entry with an async notification
  89.  * callback routine, not associated with any task.
  90.  */
  91. #define is_sync_wait(wait) (!(wait) || ((wait)->private))
  92. extern void FASTCALL(add_wait_queue(wait_queue_head_t *q, wait_queue_t * wait));
  93. extern void FASTCALL(add_wait_queue_exclusive(wait_queue_head_t *q, wait_queue_t * wait));
  94. extern void FASTCALL(remove_wait_queue(wait_queue_head_t *q, wait_queue_t * wait));
  95. static inline void __add_wait_queue(wait_queue_head_t *head, wait_queue_t *new)
  96. {
  97. list_add(&new->task_list, &head->task_list);
  98. }
  99. /*
  100.  * Used for wake-one threads:
  101.  */
  102. static inline void __add_wait_queue_tail(wait_queue_head_t *head,
  103. wait_queue_t *new)
  104. {
  105. list_add_tail(&new->task_list, &head->task_list);
  106. }
  107. static inline void __remove_wait_queue(wait_queue_head_t *head,
  108. wait_queue_t *old)
  109. {
  110. list_del(&old->task_list);
  111. }
  112. void FASTCALL(__wake_up(wait_queue_head_t *q, unsigned int mode, int nr, void *key));
  113. extern void FASTCALL(__wake_up_locked(wait_queue_head_t *q, unsigned int mode));
  114. extern void FASTCALL(__wake_up_sync(wait_queue_head_t *q, unsigned int mode, int nr));
  115. void FASTCALL(__wake_up_bit(wait_queue_head_t *, void *, int));
  116. int FASTCALL(__wait_on_bit(wait_queue_head_t *, struct wait_bit_queue *, int (*)(void *), unsigned));
  117. int FASTCALL(__wait_on_bit_lock(wait_queue_head_t *, struct wait_bit_queue *, int (*)(void *), unsigned));
  118. void FASTCALL(wake_up_bit(void *, int));
  119. int FASTCALL(out_of_line_wait_on_bit(void *, int, int (*)(void *), unsigned));
  120. int FASTCALL(out_of_line_wait_on_bit_lock(void *, int, int (*)(void *), unsigned));
  121. wait_queue_head_t *FASTCALL(bit_waitqueue(void *, int));
  122. #define wake_up(x) __wake_up(x, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, 1, NULL)
  123. #define wake_up_nr(x, nr) __wake_up(x, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, nr, NULL)
  124. #define wake_up_all(x) __wake_up(x, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, 0, NULL)
  125. #define wake_up_interruptible(x) __wake_up(x, TASK_INTERRUPTIBLE, 1, NULL)
  126. #define wake_up_interruptible_nr(x, nr) __wake_up(x, TASK_INTERRUPTIBLE, nr, NULL)
  127. #define wake_up_interruptible_all(x) __wake_up(x, TASK_INTERRUPTIBLE, 0, NULL)
  128. #define wake_up_locked(x) __wake_up_locked((x), TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE)
  129. #define wake_up_interruptible_sync(x)   __wake_up_sync((x),TASK_INTERRUPTIBLE, 1)
  130. #define __wait_event(wq, condition) 
  131. do {
  132. DEFINE_WAIT(__wait);
  133. for (;;) {
  134. prepare_to_wait(&wq, &__wait, TASK_UNINTERRUPTIBLE);
  135. if (condition)
  136. break;
  137. schedule();
  138. }
  139. finish_wait(&wq, &__wait);
  140. } while (0)
  141. /**
  142.  * wait_event - sleep until a condition gets true
  143.  * @wq: the waitqueue to wait on
  144.  * @condition: a C expression for the event to wait for
  145.  *
  146.  * The process is put to sleep (TASK_UNINTERRUPTIBLE) until the
  147.  * @condition evaluates to true. The @condition is checked each time
  148.  * the waitqueue @wq is woken up.
  149.  *
  150.  * wake_up() has to be called after changing any variable that could
  151.  * change the result of the wait condition.
  152.  */
  153. #define wait_event(wq, condition) 
  154. do {
  155. if (condition)  
  156. break;
  157. __wait_event(wq, condition);
  158. } while (0)
  159. #define __wait_event_timeout(wq, condition, ret)
  160. do {
  161. DEFINE_WAIT(__wait);
  162. for (;;) {
  163. prepare_to_wait(&wq, &__wait, TASK_UNINTERRUPTIBLE);
  164. if (condition)
  165. break;
  166. ret = schedule_timeout(ret);
  167. if (!ret)
  168. break;
  169. }
  170. finish_wait(&wq, &__wait);
  171. } while (0)
  172. /**
  173.  * wait_event_timeout - sleep until a condition gets true or a timeout elapses
  174.  * @wq: the waitqueue to wait on
  175.  * @condition: a C expression for the event to wait for
  176.  * @timeout: timeout, in jiffies
  177.  *
  178.  * The process is put to sleep (TASK_UNINTERRUPTIBLE) until the
  179.  * @condition evaluates to true. The @condition is checked each time
  180.  * the waitqueue @wq is woken up.
  181.  *
  182.  * wake_up() has to be called after changing any variable that could
  183.  * change the result of the wait condition.
  184.  *
  185.  * The function returns 0 if the @timeout elapsed, and the remaining
  186.  * jiffies if the condition evaluated to true before the timeout elapsed.
  187.  */
  188. #define wait_event_timeout(wq, condition, timeout)
  189. ({
  190. long __ret = timeout;
  191. if (!(condition)) 
  192. __wait_event_timeout(wq, condition, __ret);
  193. __ret;
  194. })
  195. #define __wait_event_interruptible(wq, condition, ret)
  196. do {
  197. DEFINE_WAIT(__wait);
  198. for (;;) {
  199. prepare_to_wait(&wq, &__wait, TASK_INTERRUPTIBLE);
  200. if (condition)
  201. break;
  202. if (!signal_pending(current)) {
  203. schedule();
  204. continue;
  205. }
  206. ret = -ERESTARTSYS;
  207. break;
  208. }
  209. finish_wait(&wq, &__wait);
  210. } while (0)
  211. /**
  212.  * wait_event_interruptible - sleep until a condition gets true
  213.  * @wq: the waitqueue to wait on
  214.  * @condition: a C expression for the event to wait for
  215.  *
  216.  * The process is put to sleep (TASK_INTERRUPTIBLE) until the
  217.  * @condition evaluates to true or a signal is received.
  218.  * The @condition is checked each time the waitqueue @wq is woken up.
  219.  *
  220.  * wake_up() has to be called after changing any variable that could
  221.  * change the result of the wait condition.
  222.  *
  223.  * The function will return -ERESTARTSYS if it was interrupted by a
  224.  * signal and 0 if @condition evaluated to true.
  225.  */
  226. #define wait_event_interruptible(wq, condition)
  227. ({
  228. int __ret = 0;
  229. if (!(condition))
  230. __wait_event_interruptible(wq, condition, __ret);
  231. __ret;
  232. })
  233. #define __wait_event_interruptible_timeout(wq, condition, ret)
  234. do {
  235. DEFINE_WAIT(__wait);
  236. for (;;) {
  237. prepare_to_wait(&wq, &__wait, TASK_INTERRUPTIBLE);
  238. if (condition)
  239. break;
  240. if (!signal_pending(current)) {
  241. ret = schedule_timeout(ret);
  242. if (!ret)
  243. break;
  244. continue;
  245. }
  246. ret = -ERESTARTSYS;
  247. break;
  248. }
  249. finish_wait(&wq, &__wait);
  250. } while (0)
  251. /**
  252.  * wait_event_interruptible_timeout - sleep until a condition gets true or a timeout elapses
  253.  * @wq: the waitqueue to wait on
  254.  * @condition: a C expression for the event to wait for
  255.  * @timeout: timeout, in jiffies
  256.  *
  257.  * The process is put to sleep (TASK_INTERRUPTIBLE) until the
  258.  * @condition evaluates to true or a signal is received.
  259.  * The @condition is checked each time the waitqueue @wq is woken up.
  260.  *
  261.  * wake_up() has to be called after changing any variable that could
  262.  * change the result of the wait condition.
  263.  *
  264.  * The function returns 0 if the @timeout elapsed, -ERESTARTSYS if it
  265.  * was interrupted by a signal, and the remaining jiffies otherwise
  266.  * if the condition evaluated to true before the timeout elapsed.
  267.  */
  268. #define wait_event_interruptible_timeout(wq, condition, timeout)
  269. ({
  270. long __ret = timeout;
  271. if (!(condition))
  272. __wait_event_interruptible_timeout(wq, condition, __ret); 
  273. __ret;
  274. })
  275. #define __wait_event_interruptible_exclusive(wq, condition, ret)
  276. do {
  277. DEFINE_WAIT(__wait);
  278. for (;;) {
  279. prepare_to_wait_exclusive(&wq, &__wait,
  280. TASK_INTERRUPTIBLE);
  281. if (condition)
  282. break;
  283. if (!signal_pending(current)) {
  284. schedule();
  285. continue;
  286. }
  287. ret = -ERESTARTSYS;
  288. break;
  289. }
  290. finish_wait(&wq, &__wait);
  291. } while (0)
  292. #define wait_event_interruptible_exclusive(wq, condition)
  293. ({
  294. int __ret = 0;
  295. if (!(condition))
  296. __wait_event_interruptible_exclusive(wq, condition, __ret);
  297. __ret;
  298. })
  299. /*
  300.  * Must be called with the spinlock in the wait_queue_head_t held.
  301.  */
  302. static inline void add_wait_queue_exclusive_locked(wait_queue_head_t *q,
  303.    wait_queue_t * wait)
  304. {
  305. wait->flags |= WQ_FLAG_EXCLUSIVE;
  306. __add_wait_queue_tail(q,  wait);
  307. }
  308. /*
  309.  * Must be called with the spinlock in the wait_queue_head_t held.
  310.  */
  311. static inline void remove_wait_queue_locked(wait_queue_head_t *q,
  312.     wait_queue_t * wait)
  313. {
  314. __remove_wait_queue(q,  wait);
  315. }
  316. /*
  317.  * These are the old interfaces to sleep waiting for an event.
  318.  * They are racy.  DO NOT use them, use the wait_event* interfaces above.  
  319.  * We plan to remove these interfaces during 2.7.
  320.  */
  321. extern void FASTCALL(sleep_on(wait_queue_head_t *q));
  322. extern long FASTCALL(sleep_on_timeout(wait_queue_head_t *q,
  323.       signed long timeout));
  324. extern void FASTCALL(interruptible_sleep_on(wait_queue_head_t *q));
  325. extern long FASTCALL(interruptible_sleep_on_timeout(wait_queue_head_t *q,
  326.     signed long timeout));
  327. /*
  328.  * Waitqueues which are removed from the waitqueue_head at wakeup time
  329.  */
  330. void FASTCALL(prepare_to_wait(wait_queue_head_t *q,
  331. wait_queue_t *wait, int state));
  332. void FASTCALL(prepare_to_wait_exclusive(wait_queue_head_t *q,
  333. wait_queue_t *wait, int state));
  334. void FASTCALL(finish_wait(wait_queue_head_t *q, wait_queue_t *wait));
  335. int autoremove_wake_function(wait_queue_t *wait, unsigned mode, int sync, void *key);
  336. int wake_bit_function(wait_queue_t *wait, unsigned mode, int sync, void *key);
  337. #define DEFINE_WAIT(name)
  338. wait_queue_t name = {
  339. .private = current,
  340. .func = autoremove_wake_function,
  341. .task_list = LIST_HEAD_INIT((name).task_list),
  342. }
  343. #define DEFINE_WAIT_BIT(name, word, bit)
  344. struct wait_bit_queue name = {
  345. .key = __WAIT_BIT_KEY_INITIALIZER(word, bit),
  346. .wait = {
  347. .private = current,
  348. .func = wake_bit_function,
  349. .task_list =
  350. LIST_HEAD_INIT((name).wait.task_list),
  351. },
  352. }
  353. #define init_wait(wait)
  354. do {
  355. (wait)->private = current;
  356. (wait)->func = autoremove_wake_function;
  357. INIT_LIST_HEAD(&(wait)->task_list);
  358. } while (0)
  359. /**
  360.  * wait_on_bit - wait for a bit to be cleared
  361.  * @word: the word being waited on, a kernel virtual address
  362.  * @bit: the bit of the word being waited on
  363.  * @action: the function used to sleep, which may take special actions
  364.  * @mode: the task state to sleep in
  365.  *
  366.  * There is a standard hashed waitqueue table for generic use. This
  367.  * is the part of the hashtable's accessor API that waits on a bit.
  368.  * For instance, if one were to have waiters on a bitflag, one would
  369.  * call wait_on_bit() in threads waiting for the bit to clear.
  370.  * One uses wait_on_bit() where one is waiting for the bit to clear,
  371.  * but has no intention of setting it.
  372.  */
  373. static inline int wait_on_bit(void *word, int bit,
  374. int (*action)(void *), unsigned mode)
  375. {
  376. if (!test_bit(bit, word))
  377. return 0;
  378. return out_of_line_wait_on_bit(word, bit, action, mode);
  379. }
  380. /**
  381.  * wait_on_bit_lock - wait for a bit to be cleared, when wanting to set it
  382.  * @word: the word being waited on, a kernel virtual address
  383.  * @bit: the bit of the word being waited on
  384.  * @action: the function used to sleep, which may take special actions
  385.  * @mode: the task state to sleep in
  386.  *
  387.  * There is a standard hashed waitqueue table for generic use. This
  388.  * is the part of the hashtable's accessor API that waits on a bit
  389.  * when one intends to set it, for instance, trying to lock bitflags.
  390.  * For instance, if one were to have waiters trying to set bitflag
  391.  * and waiting for it to clear before setting it, one would call
  392.  * wait_on_bit() in threads waiting to be able to set the bit.
  393.  * One uses wait_on_bit_lock() where one is waiting for the bit to
  394.  * clear with the intention of setting it, and when done, clearing it.
  395.  */
  396. static inline int wait_on_bit_lock(void *word, int bit,
  397. int (*action)(void *), unsigned mode)
  398. {
  399. if (!test_and_set_bit(bit, word))
  400. return 0;
  401. return out_of_line_wait_on_bit_lock(word, bit, action, mode);
  402. }
  403. #endif /* __KERNEL__ */
  404. #endif