[宏]preempt_disable
//include/linux/preempt.h
#ifdef CONFIG_PREEMPT_COUNT //如果内核支持抢占
#define preempt_disable() \
do { \
inc_preempt_count(); \
barrier(); \
} while ()
#else //如果不支持抢占,退化成了一个内存屏障
#define preempt_disable() barrier()
#endif
#define inc_preempt_count() add_preempt_count(1) //一般发行版本不会开启debug配置这里选择else
#if defined(CONFIG_DEBUG_PREEMPT) || defined(CONFIG_PREEMPT_TRACER)
extern void add_preempt_count(int val);
extern void sub_preempt_count(int val);
#else
# define add_preempt_count(val) do { preempt_count() += (val); } while ()
# define sub_preempt_count(val) do { preempt_count() -= (val); } while ()
#endif //这里就是或取了对应线程的thread_info的prempt_count字段
#define preempt_count() (current_thread_info()->preempt_count) //arch/x86/include/asm/thread_info.h
struct thread_info {
int preempt_count; /* 0 => preemptable,<0 => BUG */
}; /*内存屏障有不同的实现方法,例如gcc可以插入如下汇编实现,在某些特殊的编译器下,
提供了其他方法,内存屏障本身不具有运算功能。因此在阅读代码时可以忽略,内存屏障的语意:
“指令实际执行时确保存屏障后代码产生的指令开始执行前,内存屏障之前代码产生的指令一定
已经执行结束。并且屏障前对内存中变量的访问都已经写入到内存。”gcc的一种实现如下:*/
#define barrier() __asm__ __volatile__("": : :"memory") /*总结:
1.如果配置没有开启内核抢占配置preempt_disable退化成一个内存屏障
2.如果开启了内核抢占功能,preempt_disable一次调用会让当前线程的thread_info.preempt_count字段加1
*/

[宏]preempt_disable的更多相关文章
- barrier 和 preempt_disable() 学习【转】
#define preempt_disable() \ do{ \ inc_preempt_count(); \ barrier(); \ }while(0) 一.这个barrier 在干什么. ...
- kernel-常见参数或宏
kernel-常见参数或宏 get_online_cpus get_online_cpus(); get_online_mems(); kstrdup_const 分配内存 cache_name = ...
- Visual Studio 宏的高级用法
因为自 Visual Studio 2012 开始,微软已经取消了对宏的支持,所以本篇文章所述内容只适用于 Visual Studio 2010 或更早期版本的 VS. 在上一篇中,我已经介绍了如何编 ...
- VC 中与字符串相关的宏 _T、TEXT,_TEXT、L 的作用
CSDN原博文:http://blog.csdn.net/houkai363/article/details/8134787 遇到了:不能将参数 1 从“const char [5]”转换为“LPCT ...
- 【转】linux内核中writesb(), writesw(), writesl() 宏函数
writesb(), writesw(), writesl() 宏函数 功能 : writesb() I/O 上写入 8 位数据流数据 (1字节) writesw() I/O 上写入 16 ...
- c++宏定义命令
在程序开始以#开头的命令,他们是预编译命令.有三类预编译命令:宏定义命令.文件包含命令.条件编译命令:今天聊聊宏定义: 宏定义命令将一个标识符定义为一个字符串,源程序中的该标识符均以指定的字符串来代替 ...
- dll导入导出宏定义,出现“不允许 dllimport 函数 的定义”的问题分析
建立dll项目后,在头文件中,定义API宏 #ifndef API_S_H #define API_S_H ...... #ifndef DLL_S_20160424 #define API _dec ...
- VC++/MFC 最常用宏和指令
1.#include指令 包含指定的文件,最基本的最熟悉的指令,编程中不得不用,包含库文件用双尖括号,包含自定义头文件用双引号. 2.#define指令 预定义,通常用它来定义常量(包括无参量与 ...
- [Sass]混合宏的参数
[Sass]混合宏的参数--传一个不带值的参数 Sass 的混合宏有一个强大的功能,可以传参,那么在 Sass 中传参主要有以下几种情形: A) 传一个不带值的参数 在混合宏中,可以传一个不带任何值的 ...
随机推荐
- 166. Fraction to Recurring Decimal (Math)
Given two integers representing the numerator and denominator of a fraction, return the fraction in ...
- mysql数据库导入与导出
导出 导出数据和表结构: mysqldump -u用户名 -p 数据库名 > 数据库名.sql mysqldump -uroot -p dbname > dbname .sql ...
- 这里有一篇简单易懂的webSocket 快到碗里来~
这篇文章是我在学习的时候看到的 刚开始还不是很理解 后来自己百度 又问了一些人 回过头在看这篇文章 真的挺好的 但是原创已经不知道是谁了 转载哦~~~ -------------------- ...
- huawei FPGA方案
https://indico.cern.ch/event/669648/contributions/2838181/attachments/1581893/2500031/Huawei_Cloud_F ...
- vscode快捷键的中文版
自己整理了一份vscode快捷键的中文版本
- tab选项卡实例
之前也见了不少的tab选项卡,但是下面这个选项卡是一个页面中有多个时互不影响的. <head> <meta charset="utf-8"> <met ...
- 状态机学习(六)解析JSON2
来自 从零开始的 JSON 库教程 从零开始教授如何写一个符合标准的 C 语言 JSON 库 作者 Milo Yip https://zhuanlan.zhihu.com/json-tutorial ...
- 【APP测试(Android)】--安全测试
- Linux - PS1
\[\e[1;32m\][\u ^_^ aliyun\[\e[1;35m\] \[\e[33m\]\w ]\n$\[\e[m\] set tabstop=4set expandtabset shift ...
- 页面仔初窥"前端工程化"
今天看了几篇前端界的一位大牛--张云龙的文章,其中一篇在自己的理解范围内看得懂一些,有所收获,说的是前端工程化的事,看完算是对前端工程形成了一个模糊的概念. 现在我所接触到的前端开发,还是张云龙大神所 ...