wait _event_interruptible()函数分析
(2011-11-03 11:32:51) 标签: | 分类: |
Linux-2.6提供如下关于等待队列的操作:
(1) 定义"等待队列头",
wait_queue_head_t my_queue;
defined in linux/wait.h
struct {
defined in linux/wait.h
struct {
; struct task_list; }; typedef struct ;(2) 初始化"等待队列头" init_waitqueue_head(&my_queue); defined in linux/wait.c header file void ( *q)
{ (&q->); (&q->task_list); }定义和初始化的快捷方式: DECLARE_WAIT_QUEUE_HEAD(my_queue); linux/wait.h
#define () { \ . = (.), \ .task_list = { &().task_list, &().task_list } }
#define () \ = ()(3) 定义等待队列 DECLARE_WAITQUEUE(name, tsk); 定义并初始化一个名为name的等待队列(wait_queue_t); linux/wait.h
struct { unsigned int ; #define 0x01 void *; ; struct task_list; }; typedef struct ;
#define (, tsk) { \ . = tsk, \ . = , \ .task_list = { , } } #define (, tsk) \ = (, tsk)2 specific analysiswait_event_interruptible()。该函数修改task的状态为TASK_INTERRUPTIBLE,意味着改进程将不会继续运行直到被唤醒,然后被添加到等待队列wq中。在wait_event_interruptible()中首先判断condition是不是已经满足,如果是则直接返回0,否则调用__wait_event_interruptible(),并用__ret来存放返回值---------------------------------------------------------------#define wait_event_interruptible(wq, condition) \({ \ int __ret = 0; \ if (!(condition)) \ (wq, condition, __ret);\ __ret;