wait_event(queue, condition)
這麼 cool,竟然可以任意寫 condition,而不是 function pointer。
後來看到,原來這是 macro (include/linux/wait.h) :
#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)
所以可以寫 condition。
然後就忘了這個 macro。
幾年之後又看到後:這樣是一個 condition 的話,不就要一直檢查,不然 kernel 怎麼會知道這個 condition 相關的變數變更的時機。
後來又再看一次 macro,
才知道 prepare_to_wait( ) 後,就被掛起來了。
一定要有人叫起他,才有辦法再作 condition 檢查。
所以 誰叫醒他 (wq) ?
是 wake_up (wq...), wake_up(wq) 會叫醒所有 wq 裡面掛起的 task。
這樣 task 就會起來作 condition check。好決定是繼續睡,還是起來工作了。
所以 誰決定 那裡要 call wake_up( ) ?
--- 就是寫 wait_event_xx(wq,cond) 的人。
在 其他 task 中,讓 condition 變更時,就叫 wake_up,讓所有相關的 task 起來。
--- 所以這個 wait_event, wake_up 的同步機制,有點手動的感覺。
沒有留言:
張貼留言