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、超时到达时,条件不为真或没有唤醒也会返回,这样才有意义,可以有界返回,而不会死睡在那。可现象却不是这样,查了查源代码也没找出能解释上面现象的地方,望大侠指教~在此谢过~
现象如下:
在驱动中用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的值
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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28