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相关推荐

  1. 解决Swift中present(uiImagePickerController,animated: true,completion: nil)闪退的问题

    swift中开发选择图片上传,会使用到Tap Gesture Recognizer控件,对应 UITapGestureRecognizer API,以下是代码示例(取自IOS developer li ...

  2. Evaluation and Validation of AssemblingCorrected PacBio Long Reads for MicrobialGenome Completion

    Evaluation and Validation of Assembling Corrected PacBio Long Reads for Microbial Genome Completion ...

  3. GAN人脸修复--Generative Face Completion

    Generative Face Completion CVPR 2017 https://arxiv.org/abs/1704.05838 Code: https://github.com/Yijun ...

  4. 理解I/O Completion Port(完成端口)

    欢迎阅读此篇IOCP教程.我将先给出IOCP的定义然后给出它的实现方法,最后剖析一个Echo程序来为您拨开IOCP的谜云,除去你心中对IOCP的烦恼.OK,但我不能保证你明白IOCP的一切,但我会尽我 ...

  5. 解决: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 ...

  6. semaphore, completion 和 wait_queue

    semaphore 和 completion 都要使用 wait_queue_t 来实现休眠. 但completeion 和 semaphore  本质都是整数 P, V操作和对0的判断: 而用户定义 ...

  7. animateWithDuration:animations:completion:

    为什么80%的码农都做不了架构师?>>>    Creates an animation block object that can be used to set up keyfra ...

  8. UA MATH567 高维统计专题2 Low-rank矩阵及其估计1 Matrix Completion简介

    UA MATH567 高维统计专题2 Low-rank矩阵及其估计1 Low-rank Matrix简介 例 在推荐系统中,Netflix data是非常经典的数据集.考虑它的电影评分数据,用矩阵的每 ...

  9. 论文笔记:Matrix Completion in the Unit Hypercube via Structured Matrix Factorization

    2019 IJCAI 0 摘要 复杂任务可以通过将它们映射到矩阵完成(matrix completion)问题来简化.在本文中,我们解决了我们公司面临的一个关键挑战:预测艺术家在电影镜头中渲染视觉效果 ...

  10. pytorch 笔记: 复现论文 Stochastic Weight Completion for Road Networks using Graph Convolutional Networks

    1 理论部分 论文笔记:Stochastic Weight Completion for Road Networks using Graph Convolutional Networks_UQI-LI ...

最新文章

  1. SRM 397(1-250pt)
  2. xp mysql字符集与乱码_解决MYSQL中文乱码问题三种方法
  3. HTML5 处理响应式图片
  4. php中正则表达式用法,php与js中的正则表达式用法
  5. org.activiti.engine.ActivitiException: Couldn‘t deserialize object in variable ‘application‘
  6. 搜索python代码的软件_用python编写一个高效搜索代码工具
  7. 团队作业8——测试与发布(Beta阶段)
  8. db2诊断系列之---定位锁等待问题
  9. 一个简单的crontab
  10. centos 修改密码_openstack Train版部署——基于centos系统(四)
  11. Java NIO与IO的差别和比較
  12. 前端很慌!React 称霸,Vue 凶猛,TypeScript 威逼 JavaScript
  13. layer —— 一个简单的jQuery弹出层插件
  14. latex acm-sigconf使用总结
  15. UCINET软件使用简介 ——主菜单功能简介1
  16. 天翼云盘v6.3.5绿色精简版
  17. 量子计算基础——量子测量
  18. 智课雅思短语---三、unshakable duty
  19. 人工智能之父图灵头像将登上新版50英镑钞票
  20. 服务器日志显示意外关闭,服务器多次异常关闭,错误日志:计算机已经从检测错误后重新启动。。检测错误: - Microsoft Community...

热门文章

  1. 什么是epub格式,windows上有什么好用的epub阅读器
  2. PW5410A原厂低噪声DC-DC升压开关电容倍压器
  3. input type=“date“
  4. 【软件测试】测试用例的设计
  5. matlab打开.mat文件
  6. sdut-oop-6 计算各种图形的周长(多态)
  7. 2021龙川隆师中学高考成绩查询入口,2020重庆高考成绩查询系统入口官网
  8. 【详细图文】Ubuntu 16.04更改下载源 解决软件包下载慢问题
  9. 鬼谷八荒流派收集(2)流水剑
  10. 深入理解并发编程之CAS无锁机制与ABA问题