标签:completion __ head struct 说明 done Linux wait
completion是内核中的一种同步机制,该机制主要借助等待队列实现同步,该同步机制是一种简单的同步机制。
下面简要分析下该同步机制的实现(本次源码基于linux 3.10)。
一、结构体说明
struct completion {
unsigned int done;
wait_queue_head_t wait;
};
主要包括等待队列头以及完成量统计值done变量。
而针对等待队列头的结构体,主要包含自旋锁与链表。
struct __wait_queue_head {
spinlock_t lock;
struct list_head task_list;
};
typedef struct __wait_queue_head wait_queue_head_t;
二、completion的初始化
主要包括宏初始化与函数初始化两种方式
2.1宏初始化
宏初始化定义如下所示,主要是将done变量设置为0,并调用静态初始化等待队列头的宏
__WAIT_QUEUE_HEAD_INITIALIZER
#define COMPLETION_INITIALIZER(work) \
{ 0, __WAIT_QUEUE_HEAD_INITIALIZER((work).wait) }
2.2函数初始化
该接口逻辑简单,代码如下
static inline void init_completion(struct completion *x)
{
x->done = 0;
init_waitqueue_head(&x->wait);
}
三、等待接口
该接口名称wait_for_completion,主要调用wait_for_common,而wait_for_common则主要是将当前线程加入等待队列,然后调用schedule将
自己调度出去,等到被唤醒后,则判断done变量是否大于0,若大于0则返回,否则继续等待,直至done变为1。
void __sched wait_for_completion(struct completion *x)
{
wait_for_common(x, MAX_SCHEDULE_TIMEOUT, TASK_UNINTERRUPTIBLE);
}
关于wait_for_completion的调用流程图如下所示,针对completion来说,其虽然调用了__wait_for_common,但其并没有使用超时返回的操作,具体可通过schedule_timeout的实现确定,关于schedule_timeout的实现已在下面的流程中有介绍。
标签:completion,__,head,struct,说明,done,Linux,wait 来源: https://blog.csdn.net/lpwsw/article/details/121716402
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。