+ -
当前位置:首页 → 问答吧 → wait_event_timeout(wq, condition, timeout)中如果condition条件不为真,用wake_up怎么无法唤醒?

wait_event_timeout(wq, condition, timeout)中如果condition条件不为真,用wake_up怎么无法唤醒?

时间:2011-11-04

来源:互联网

小弟最近开始搞驱动,遇到问题,请大侠帮忙~
现象如下:
在驱动中用wait_event_timeout睡眠,然后在中断中用wake_up唤醒,但如果唤醒时condition条件不为真,cpu连调度都不会调度wait_event的后续代码,而且即使超时到了,也不会执行。而如果用wake_up唤醒时,condition条件为真,则可以顺利处理后续代码。

这根我的理解不同,之前我认为wait_event_timeout函数在1、condition为真且被wake_up唤醒时会醒来2、超时到达时,条件不为真或没有唤醒也会返回,这样才有意义,可以有界返回,而不会死睡在那。可现象却不是这样,查了查源代码也没找出能解释上面现象的地方,望大侠指教~在此谢过~

作者: sasasdsdffdd   发布时间: 2011-11-04

#define __wait_event_timeout(wq, condition, ret) \
do { \
DEFINE_WAIT(__wait); \
\
for (;;) { \
prepare_to_wait(&wq, &__wait, TASK_UNINTERRUPTIBLE); \
if (condition) \
break; \
ret = schedule_timeout(ret); \
if (!ret) \
break; \
} \
finish_wait(&wq, &__wait); \
} while (0)

 kernel代码wait_event_timout的实现,是个循环,会测试condition是否为真
如果条件为假,你唤醒后测试发现条件为假,会继续休眠
事实上schedule_timout也会在超时后继续运行并测试condition的值

作者: hero1985   发布时间: 2011-11-08