completion 1
completion也是继续wait queue实现的。主要是一方调用下面的接口来等到某个操作完成
extern void wait_for_completion(struct completion *);
extern void wait_for_completion_io(struct completion *);
extern int wait_for_completion_interruptible(struct completion *x);
extern int wait_for_completion_killable(struct completion *x);
extern unsigned long wait_for_completion_timeout(struct completion *x,
unsigned long timeout);
extern unsigned long wait_for_completion_io_timeout(struct completion *x,
unsigned long timeout);
extern long wait_for_completion_interruptible_timeout(
struct completion *x, unsigned long timeout);
extern long wait_for_completion_killable_timeout(
struct completion *x, unsigned long timeout);
另外一方是调用下面的即可告诉正在等待的对象,操作已经完成了。
extern bool completion_done(struct completion *x);
extern void complete(struct completion *);
extern void complete_all(struct completion *);
在kernel中用completion 来表示一个完成量.
struct completion {
unsigned int done;
wait_queue_head_t wait;
};
在使用completion之前需要初始化。可以调用下面两种方法初始化
#define DECLARE_COMPLETION(work) \
struct completion work = COMPLETION_INITIALIZER(work)
和
static inline void init_completion(struct completion *x)
{
x->done = 0;
init_waitqueue_head(&x->wait);
}
这两种的区别是第二种需要在调用init_completion之前先定义好completion,也就是为completion申请空间.
还有一种定义如下:
#ifdef CONFIG_LOCKDEP
# define DECLARE_COMPLETION_ONSTACK(work) \
struct completion work = COMPLETION_INITIALIZER_ONSTACK(work)
#else
# define DECLARE_COMPLETION_ONSTACK(work) DECLARE_COMPLETION(work)
#endif
即在stack上建立completion。但是如上面定义所以如果没有定义CONFIG_LOCKDEP的话,DECLARE_COMPLETION_ONSTACK 就和DECLARE_COMPLETION 是一样的。因为如果在函数中调用DECLARE_COMPLETION 本来就是在stack上建立的,而COMPLETION_INITIALIZER_ONSTACK 只是为了防止死锁,我们一般没有定义.
而如果定义了CONFIG_LOCKDEP,DECLARE_COMPLETION_ONSTACK 感觉也是先定义一个completion,然后调用init_completion初始化,暂时没有看出这两个有什么区别.
#define init_waitqueue_head(q) \
do { \
static struct lock_class_key __key; \
\
__init_waitqueue_head((q), #q, &__key); \
} while (0)
直接调用__init_waitqueue_head来初始化,这里会申请一个lock_class_key对象,也是用于死锁debug的.
void __init_waitqueue_head(wait_queue_head_t *q, const char *name, struct lock_class_key *key)
{
spin_lock_init(&q->lock);
lockdep_set_class_and_name(&q->lock, key, name);
INIT_LIST_HEAD(&q->task_list);
}
最终调用INIT_LIST_HEAD 来初始化completion的wait_queue_head_t。
#define COMPLETION_INITIALIZER(work) \
{ 0, __WAIT_QUEUE_HEAD_INITIALIZER((work).wait) }
注意这里传递的是(work).wait)。
#define __WAIT_QUEUE_HEAD_INITIALIZER(name) { \
.lock = __SPIN_LOCK_UNLOCKED(name.lock), \
.task_list = { &(name).task_list, &(name).task_list } }
这里让task_list的前后指针都指向(name).task_list 来完成初始化.
completion 1相关推荐
- 解决Swift中present(uiImagePickerController,animated: true,completion: nil)闪退的问题
swift中开发选择图片上传,会使用到Tap Gesture Recognizer控件,对应 UITapGestureRecognizer API,以下是代码示例(取自IOS developer li ...
- Evaluation and Validation of AssemblingCorrected PacBio Long Reads for MicrobialGenome Completion
Evaluation and Validation of Assembling Corrected PacBio Long Reads for Microbial Genome Completion ...
- GAN人脸修复--Generative Face Completion
Generative Face Completion CVPR 2017 https://arxiv.org/abs/1704.05838 Code: https://github.com/Yijun ...
- 理解I/O Completion Port(完成端口)
欢迎阅读此篇IOCP教程.我将先给出IOCP的定义然后给出它的实现方法,最后剖析一个Echo程序来为您拨开IOCP的谜云,除去你心中对IOCP的烦恼.OK,但我不能保证你明白IOCP的一切,但我会尽我 ...
- 解决:Reading table information for completion of table and column names
mysql -A不预读数据库信息(use dbname 更快)-Reading table information for completion of table and column names Y ...
- semaphore, completion 和 wait_queue
semaphore 和 completion 都要使用 wait_queue_t 来实现休眠. 但completeion 和 semaphore 本质都是整数 P, V操作和对0的判断: 而用户定义 ...
- animateWithDuration:animations:completion:
为什么80%的码农都做不了架构师?>>> Creates an animation block object that can be used to set up keyfra ...
- UA MATH567 高维统计专题2 Low-rank矩阵及其估计1 Matrix Completion简介
UA MATH567 高维统计专题2 Low-rank矩阵及其估计1 Low-rank Matrix简介 例 在推荐系统中,Netflix data是非常经典的数据集.考虑它的电影评分数据,用矩阵的每 ...
- 论文笔记:Matrix Completion in the Unit Hypercube via Structured Matrix Factorization
2019 IJCAI 0 摘要 复杂任务可以通过将它们映射到矩阵完成(matrix completion)问题来简化.在本文中,我们解决了我们公司面临的一个关键挑战:预测艺术家在电影镜头中渲染视觉效果 ...
- pytorch 笔记: 复现论文 Stochastic Weight Completion for Road Networks using Graph Convolutional Networks
1 理论部分 论文笔记:Stochastic Weight Completion for Road Networks using Graph Convolutional Networks_UQI-LI ...
最新文章
- SRM 397(1-250pt)
- xp mysql字符集与乱码_解决MYSQL中文乱码问题三种方法
- HTML5 处理响应式图片
- php中正则表达式用法,php与js中的正则表达式用法
- org.activiti.engine.ActivitiException: Couldn‘t deserialize object in variable ‘application‘
- 搜索python代码的软件_用python编写一个高效搜索代码工具
- 团队作业8——测试与发布(Beta阶段)
- db2诊断系列之---定位锁等待问题
- 一个简单的crontab
- centos 修改密码_openstack Train版部署——基于centos系统(四)
- Java NIO与IO的差别和比較
- 前端很慌!React 称霸,Vue 凶猛,TypeScript 威逼 JavaScript
- layer —— 一个简单的jQuery弹出层插件
- latex acm-sigconf使用总结
- UCINET软件使用简介 ——主菜单功能简介1
- 天翼云盘v6.3.5绿色精简版
- 量子计算基础——量子测量
- 智课雅思短语---三、unshakable duty
- 人工智能之父图灵头像将登上新版50英镑钞票
- 服务器日志显示意外关闭,服务器多次异常关闭,错误日志:计算机已经从检测错误后重新启动。。检测错误: - Microsoft Community...
热门文章
- 什么是epub格式,windows上有什么好用的epub阅读器
- PW5410A原厂低噪声DC-DC升压开关电容倍压器
- input type=“date“
- 【软件测试】测试用例的设计
- matlab打开.mat文件
- sdut-oop-6 计算各种图形的周长(多态)
- 2021龙川隆师中学高考成绩查询入口,2020重庆高考成绩查询系统入口官网
- 【详细图文】Ubuntu 16.04更改下载源 解决软件包下载慢问题
- 鬼谷八荒流派收集(2)流水剑
- 深入理解并发编程之CAS无锁机制与ABA问题