Dear Domen, Thanks for your reply first. >I understand it this way: >- condition > Just checking the condition is one way (if you don't have a wake_up > source, like an interrupt), but that's not really what wait_event does. > It would be something like > while (condition) { > msleep(10); > } > There was some talk on poll_wait(), but I don't know what happened to > it.
So you mean in my senario (wake the process up in the interrupt handler), I needn't to use wake_up at all? A "condition == true" in the interrupt handler is enough to wake the sleeping process up? Am I right? I checked the source code in linux/wait.h and here is the defination of wait_event: #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) From the source code, it seems like that this mechanism doesn't use msleep(), like what you mentioned, to release its executing. Instead, it uses schedule() to do that. >- wake_up > Just wake_up isn't enough, you get a race: > | interrupt handler | process | > ------------------------------------------ > | do_something() | | > | wake_up() | | > | ... | wait on wq | > > And so you have a process waiting on waitqueue, that just missed the > wakeup. Obviously should not be used. > >- wake_up & condition > | interrupt handler | process | > ------------------------------------------ > | flag = 1 | | > | wake_up() | | > | ... | wait_event | > | ... | flag = 0 | > > This will work properly and if wait_event misses a wake_up, the > condition check (flag) will kick in before putting it to sleep. > Thanks for your explaining on the race problem. I can understand this now. However I still cannot understand, is such a problem: In the above figures for my case, if flag=1 could wake the process up, then what's the use of wake_up()? From my understanding if the condition turns true, then the process which depends on this condition will be waken up. Thus what's the exact use of wake_up()? Also in my program, I tried to remove wake_up() sentence and it seems that there is no difference on the result. Thanks for the explanation. BR Ming _________________________________________________________________ 与联机的朋友进行交流,请使用 MSN Messenger: http://messenger.msn.com/cn _______________________________________________ Linuxppc-embedded mailing list Linuxppc-embedded@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-embedded