wait_event_interruptible(wq, condition),該函數修改task的狀態為TASK_INTERRUPTIBLE,意味著該進程將不會繼續運行直到被喚醒,然後被添加到等待隊列wq中。
在wait_event_interruptible()中首先判斷condition是不是已經滿足,如果條件滿足則直接返回0,否則調用__wait_event_interruptible(),並用__ret來存放返回值
#define wait_event_interruptible(wq, condition) \ ({ \ int __ret = 0; \ if (!(condition)) \ __wait_event_interruptible(wq, condition, __ret);\ __ret; \ })
在無限循環中,__wait_event_interruptible()將本進程置為可中斷的掛起狀態,反復檢查condition是否成立,如果成立則退出,如果不成立則繼續休眠;條件滿足後,即把本進程運行狀態置為運行態
,並將__wait從等待隊列中清除掉,從而進程能夠調度運行。如果進程當前有異步信號(POSIX的),則返回-ERESTARTSYS。
#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)