wait.h
来自「Linux Kernel 2.6.9 for OMAP1710」· C头文件 代码 · 共 323 行
H
323 行
#ifndef _LINUX_WAIT_H#define _LINUX_WAIT_H#define WNOHANG 0x00000001#define WUNTRACED 0x00000002#define WSTOPPED WUNTRACED#define WEXITED 0x00000004#define WCONTINUED 0x00000008#define WNOWAIT 0x01000000 /* Don't reap, just poll status. */#define __WNOTHREAD 0x20000000 /* Don't wait on children of other threads in this group */#define __WALL 0x40000000 /* Wait on all children, regardless of type */#define __WCLONE 0x80000000 /* Wait only on non-SIGCHLD children *//* First argument to waitid: */#define P_ALL 0#define P_PID 1#define P_PGID 2#ifdef __KERNEL__#include <linux/config.h>#include <linux/list.h>#include <linux/stddef.h>#include <linux/spinlock.h>#include <asm/system.h>typedef struct __wait_queue wait_queue_t;typedef int (*wait_queue_func_t)(wait_queue_t *wait, unsigned mode, int sync, void *key);int default_wake_function(wait_queue_t *wait, unsigned mode, int sync, void *key);struct __wait_queue { unsigned int flags;#define WQ_FLAG_EXCLUSIVE 0x01 struct task_struct * task; wait_queue_func_t func; struct list_head task_list;};struct __wait_queue_head { spinlock_t lock; struct list_head task_list;};typedef struct __wait_queue_head wait_queue_head_t;/* * Macros for declaration and initialisaton of the datatypes */#define __WAITQUEUE_INITIALIZER(name, tsk) { \ .task = tsk, \ .func = default_wake_function, \ .task_list = { NULL, NULL } }#define DECLARE_WAITQUEUE(name, tsk) \ wait_queue_t name = __WAITQUEUE_INITIALIZER(name, tsk)#define __WAIT_QUEUE_HEAD_INITIALIZER(name) { \ .lock = SPIN_LOCK_UNLOCKED, \ .task_list = { &(name).task_list, &(name).task_list } }#define DECLARE_WAIT_QUEUE_HEAD(name) \ wait_queue_head_t name = __WAIT_QUEUE_HEAD_INITIALIZER(name)static inline void init_waitqueue_head(wait_queue_head_t *q){ q->lock = SPIN_LOCK_UNLOCKED; INIT_LIST_HEAD(&q->task_list);}static inline void init_waitqueue_entry(wait_queue_t *q, struct task_struct *p){ q->flags = 0; q->task = p; q->func = default_wake_function;}static inline void init_waitqueue_func_entry(wait_queue_t *q, wait_queue_func_t func){ q->flags = 0; q->task = NULL; q->func = func;}static inline int waitqueue_active(wait_queue_head_t *q){ return !list_empty(&q->task_list);}/* * Used to distinguish between sync and async io wait context: * sync i/o typically specifies a NULL wait queue entry or a wait * queue entry bound to a task (current task) to wake up. * aio specifies a wait queue entry with an async notification * callback routine, not associated with any task. */#define is_sync_wait(wait) (!(wait) || ((wait)->task))extern void FASTCALL(add_wait_queue(wait_queue_head_t *q, wait_queue_t * wait));extern void FASTCALL(add_wait_queue_exclusive(wait_queue_head_t *q, wait_queue_t * wait));extern void FASTCALL(remove_wait_queue(wait_queue_head_t *q, wait_queue_t * wait));static inline void __add_wait_queue(wait_queue_head_t *head, wait_queue_t *new){ list_add(&new->task_list, &head->task_list);}/* * Used for wake-one threads: */static inline void __add_wait_queue_tail(wait_queue_head_t *head, wait_queue_t *new){ list_add_tail(&new->task_list, &head->task_list);}static inline void __remove_wait_queue(wait_queue_head_t *head, wait_queue_t *old){ list_del(&old->task_list);}void FASTCALL(__wake_up(wait_queue_head_t *q, unsigned int mode, int nr, void *key));extern void FASTCALL(__wake_up_locked(wait_queue_head_t *q, unsigned int mode));extern void FASTCALL(__wake_up_sync(wait_queue_head_t *q, unsigned int mode, int nr));#define wake_up(x) __wake_up(x, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, 1, NULL)#define wake_up_nr(x, nr) __wake_up(x, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, nr, NULL)#define wake_up_all(x) __wake_up(x, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, 0, NULL)#define wake_up_all_sync(x) __wake_up_sync((x),TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, 0)#define wake_up_interruptible(x) __wake_up(x, TASK_INTERRUPTIBLE, 1, NULL)#define wake_up_interruptible_nr(x, nr) __wake_up(x, TASK_INTERRUPTIBLE, nr, NULL)#define wake_up_interruptible_all(x) __wake_up(x, TASK_INTERRUPTIBLE, 0, NULL)#define wake_up_locked(x) __wake_up_locked((x), TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE)#define wake_up_interruptible_sync(x) __wake_up_sync((x),TASK_INTERRUPTIBLE, 1)#define __wait_event(wq, condition) \do { \ DEFINE_WAIT(__wait); \ \ for (;;) { \ prepare_to_wait(&wq, &__wait, TASK_UNINTERRUPTIBLE); \ if (condition) \ break; \ schedule(); \ } \ finish_wait(&wq, &__wait); \} while (0)#define wait_event(wq, condition) \do { \ if (condition) \ break; \ __wait_event(wq, condition); \} while (0)#define __wait_event_timeout(wq, condition, ret) \do { \ DEFINE_WAIT(__wait); \ \ for (;;) { \ prepare_to_wait(&wq, &__wait, TASK_UNINTERRUPTIBLE); \ if (condition) \ break; \ ret = schedule_timeout(ret); \ if (!ret) \ break; \ } \ finish_wait(&wq, &__wait); \} while (0)#define wait_event_timeout(wq, condition, timeout) \({ \ long __ret = timeout; \ if (!(condition)) \ __wait_event_timeout(wq, condition, __ret); \ __ret; \})#define __wait_event_interruptible(wq, condition, ret) \do { \ DEFINE_WAIT(__wait); \ \ for (;;) { \ prepare_to_wait(&wq, &__wait, TASK_INTERRUPTIBLE); \ if (condition) \ break; \ if (!signal_pending(current)) { \ schedule(); \ continue; \ } \ ret = -ERESTARTSYS; \ break; \ } \ finish_wait(&wq, &__wait); \} while (0)#define wait_event_interruptible(wq, condition) \({ \ int __ret = 0; \ if (!(condition)) \ __wait_event_interruptible(wq, condition, __ret); \ __ret; \})#define __wait_event_interruptible_timeout(wq, condition, ret) \do { \ DEFINE_WAIT(__wait); \ \ for (;;) { \ prepare_to_wait(&wq, &__wait, TASK_INTERRUPTIBLE); \ if (condition) \ break; \ if (!signal_pending(current)) { \ ret = schedule_timeout(ret); \ if (!ret) \ break; \ continue; \ } \ ret = -ERESTARTSYS; \ break; \ } \ finish_wait(&wq, &__wait); \} while (0)#define wait_event_interruptible_timeout(wq, condition, timeout) \({ \ long __ret = timeout; \ if (!(condition)) \ __wait_event_interruptible_timeout(wq, condition, __ret); \ __ret; \})#define __wait_event_interruptible_exclusive(wq, condition, ret) \do { \ DEFINE_WAIT(__wait); \ \ for (;;) { \ prepare_to_wait_exclusive(&wq, &__wait, \ TASK_INTERRUPTIBLE); \ if (condition) \ break; \ if (!signal_pending(current)) { \ schedule(); \ continue; \ } \ ret = -ERESTARTSYS; \ break; \ } \ finish_wait(&wq, &__wait); \} while (0)#define wait_event_interruptible_exclusive(wq, condition) \({ \ int __ret = 0; \ if (!(condition)) \ __wait_event_interruptible_exclusive(wq, condition, __ret);\ __ret; \})/* * Must be called with the spinlock in the wait_queue_head_t held. */static inline void add_wait_queue_exclusive_locked(wait_queue_head_t *q, wait_queue_t * wait){ wait->flags |= WQ_FLAG_EXCLUSIVE; __add_wait_queue_tail(q, wait);}/* * Must be called with the spinlock in the wait_queue_head_t held. */static inline void remove_wait_queue_locked(wait_queue_head_t *q, wait_queue_t * wait){ __remove_wait_queue(q, wait);}/* * These are the old interfaces to sleep waiting for an event. * They are racy. DO NOT use them, use the wait_event* interfaces above. * We plan to remove these interfaces during 2.7. */extern void FASTCALL(sleep_on(wait_queue_head_t *q));extern long FASTCALL(sleep_on_timeout(wait_queue_head_t *q, signed long timeout));extern void FASTCALL(interruptible_sleep_on(wait_queue_head_t *q));extern long FASTCALL(interruptible_sleep_on_timeout(wait_queue_head_t *q, signed long timeout));/* * Waitqueues which are removed from the waitqueue_head at wakeup time */void FASTCALL(prepare_to_wait(wait_queue_head_t *q, wait_queue_t *wait, int state));void FASTCALL(prepare_to_wait_exclusive(wait_queue_head_t *q, wait_queue_t *wait, int state));void FASTCALL(finish_wait(wait_queue_head_t *q, wait_queue_t *wait));int autoremove_wake_function(wait_queue_t *wait, unsigned mode, int sync, void *key);#define DEFINE_WAIT(name) \ wait_queue_t name = { \ .task = current, \ .func = autoremove_wake_function, \ .task_list = { .next = &name.task_list, \ .prev = &name.task_list, \ }, \ }#define init_wait(wait) \ do { \ wait->task = current; \ wait->func = autoremove_wake_function; \ INIT_LIST_HEAD(&wait->task_list); \ } while (0) #endif /* __KERNEL__ */#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?