wait_event()函数集合详解
2014-10-22 23:56
316 查看
在对当前的运行的进程进行阻塞时经常会用到wait_event()这个函数,来看看linux内核中时如何实现wait_event()这个函数的。
先介绍几个宏定义函数:
1. #define DEFINE_WAIT_FUNC(name, function) \
wait_queue_t name = { \
.private = current, \
.func = function, \
.task_list = LIST_HEAD_INIT((name).task_list),\
}
2. #define DEFINE_WAIT(name) \
DEFINE_WAIT_FUNC(name, autoremove_wake_function)
3. #define init_wait(name) \
do{ \
(name)->private = current;\
(name)->func = autoremove_wake_function; \
INIT_LIST_HEAD(&name->task_list);
}while(0)
因此 DEFINE_WAIT(name)定义了一个wait_queue_t结构体,并且将其与当前正在运行的进程进行挂钩,同时定义了当前这个进程在被唤醒以后所做的处理函数 autoremove_wake_function()。
wait_event()函数的实现:
#define __wait_event(wq, condition) \
do{ \
DEFINE_WAIT(__wait); \ 定义并初始化了一个wait_queue_t
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)
wait_event_timeout()函数的实现:
#define __wait_event_timeout(wq,condition,ret) \
do{ \
DEFINE_WAIT(__wait); \
for(;;) \
{ \
prepare_to_wait(&wq,&__wait, TASK_UNINTERRUPTIBLE); \
if(conditon) \
break; \
ret = schedule_timeout(ret); \
if(!ret) \
break; \
}
finish_wait(&wq, &__wait); \
}while(0)
#define wait_event_timeout(wq, conditon, timeout) \
( long __ret = timeout;\
if(!condition) \
__wait_event_timeout(wq, conditon, __ret); \
__ret;)
先介绍几个宏定义函数:
1. #define DEFINE_WAIT_FUNC(name, function) \
wait_queue_t name = { \
.private = current, \
.func = function, \
.task_list = LIST_HEAD_INIT((name).task_list),\
}
2. #define DEFINE_WAIT(name) \
DEFINE_WAIT_FUNC(name, autoremove_wake_function)
3. #define init_wait(name) \
do{ \
(name)->private = current;\
(name)->func = autoremove_wake_function; \
INIT_LIST_HEAD(&name->task_list);
}while(0)
因此 DEFINE_WAIT(name)定义了一个wait_queue_t结构体,并且将其与当前正在运行的进程进行挂钩,同时定义了当前这个进程在被唤醒以后所做的处理函数 autoremove_wake_function()。
wait_event()函数的实现:
#define __wait_event(wq, condition) \
do{ \
DEFINE_WAIT(__wait); \ 定义并初始化了一个wait_queue_t
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)
wait_event_timeout()函数的实现:
#define __wait_event_timeout(wq,condition,ret) \
do{ \
DEFINE_WAIT(__wait); \
for(;;) \
{ \
prepare_to_wait(&wq,&__wait, TASK_UNINTERRUPTIBLE); \
if(conditon) \
break; \
ret = schedule_timeout(ret); \
if(!ret) \
break; \
}
finish_wait(&wq, &__wait); \
}while(0)
#define wait_event_timeout(wq, conditon, timeout) \
( long __ret = timeout;\
if(!condition) \
__wait_event_timeout(wq, conditon, __ret); \
__ret;)
相关文章推荐
- 互斥量、条件变量与pthread_cond_wait()函数的使用,详解
- 互斥量、条件变量与pthread_cond_wait()函数的使用,详解
- wait和waitpid函数详解
- 关于函数wait_event_interruptible(wq, condition)
- 用ACE的Reactor模式实现网络通讯时,ACE内部用WSAEventSelect函数把网络事件与一个事件对象关联起来,目的是为了后面用WaitForMultipleObjects函数统一处理。
- keybd_event函数详解(请别忽视了scan codes!)
- jQuery Event.stopPropagation() 函数详解
- linux内核中等待队列 (函数wait_event与wake_up)
- 关于函数wait_event_interruptible(wq, condition)
- 互斥量、条件变量与pthread_cond_wait()函数的使用,详解(一)
- 互斥量、条件变量与pthread_cond_wait()函数的使用,详解
- linux内核中等待队列 (函数wait_event与wake_up)
- linux内核中等待队列 (函数wait_event与wake_up)
- 条件变量(互斥量)与pthread_cond_wait函数详解
- Symbian按键处理函数:OfferKeyEventL()详解
- 多线程同步 -- WaitForMultipleObjects()函数的使用详解
- pthread_cond_wait()函数详解
- wait _event_interruptible()函数分析
- linux 中的进程wait()和waitpid函数,僵尸进程详解,以及利用这两个函数解决进程同步问题
- 互斥量、条件变量与pthread_cond_wait()函数的使用,详解(二)