Linux内核等待队列wait(3)

2. 关于wait_event_interruptible的返回值

根据 wait_event_interruptible 的宏定义知:

1) 条件condition为真时调用这个函数将直接返回0,而当前进程不会被 wait_event_interruptible和从runqueue队列中删除。

2) 如果要被wait_event_interruptible的当前进程有nonblocked pending  signals, 那么会直接返回-ERESTARTSYS(i.e. -512),当前进程不会被wait_event_interruptible 和从runqueue队列中删除。

3) 其他情况下,当前进程会被正常的wait_event_interruptible,并从runqueue队列中删除,进入TASK_INTERRUPTIBLE状态退出运行调度,直到再次被唤醒加入runqueue队列中后而参与调度,将正常返回0。

附1:wait_event_interruptible  宏

#define wait_event_interruptible(wq, condition)    \ 
({                                                \ 
    int __ret = 0;                                  \ 
    if (!(condition))                              \ 
      __wait_event_interruptible(wq, condition, __ret); \ 
      __ret;                                        \ 
}) 

注: C语言中{a,b, ..., x}的的值等于最后一项,即x,因此上述宏的值是 __ret。

附2:wait_event_interruptible()和 wake_up的等效代码

wait_event_interruptible(wq, condition) /*等效没有考虑返回值*/ 

    if (!(condition)) 
    { 
        wait_queue_t _ _wait; 
        init_waitqueue_entry(&_ _wait, current); 
        add_wait_queue(&wq, &_ _wait); 
        for (;;) 
        { 
            set_current_state(TASK_INTERRUPTIBLE); 
            if (condition) 
            break; 
            schedule();  /* implicit call: del_from_runqueue(current)*/ 
        } 
        current->state = TASK_RUNNING; 
        remove_wait_queue(&wq, &_ _wait); 
      } 

 
 
void wake_up(wait_queue_head_t *q) 

      struct list_head *tmp; 
      wait_queue_t *curr; 
      list_for_each(tmp, &q->task_list) 
      { 
        curr = list_entry(tmp, wait_queue_t, task_list); 
        wake_up_process(curr->task); 
        /* implicit call: add_to_runqueue(curr->task);*/ 
        if (curr->flags) 
          break; 
      } 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/0d0abf5697669227816c3a8e71763b5b.html