[宏]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) 传一个不带值的参数 在混合宏中,可以传一个不带任何值的 ...
随机推荐
- matplotlib 坑
1 archlinux里安装好matplotlib之后一定要安装python-cario pacman -S python-cairo
- 725. Split Linked List in Parts把链表分成长度不超过1的若干部分
[抄题]: Given a (singly) linked list with head node root, write a function to split the linked list in ...
- ltp 分析 fail testcase
https://blog.csdn.net/scene_2015/article/details/82729955 github ltp https://github.com/linux-test- ...
- node.js 使用 net 模块模拟 websocket 握手,进行数据传递。
websocket 是一种让浏览器与服务器之间建立持久的连接,并能进行双向数据传输的一种协议. websocket 属性应用层协议,基于tcp传输协议,并复用http的握手通道. 一.如何进行webs ...
- eclipse中集成python开发环境
转载:https://www.cnblogs.com/mywood/p/7272487.html Eclipse简介 Eclipse是java开发最常用的IDE,功能强大,可以在MAC和Windos上 ...
- No module named HTMLTestRunner
今天把我在公司写的自动化项目copy回家,在家里的电脑运行是报了个No module named HTMLTestRunner,看到后心想这问题好解决嘛,一个pip install HTMLTestR ...
- hugepage优势
hugepage的优势与使用 +2投票 优势 通过使用hugepage分配可以提高性能,因为需要更少的页,因此需要更少Translation Lookaside Buffers (TLB,高速传送 ...
- 批量屏蔽符合条件的IP地址,支持添加白名单,IP段,增量,大于指定次数的IP
批量屏蔽符合条件的IP地址,支持添加白名单,IP段,增量 大概的思路是利用sh,从日志中提取出来对应的IP地址,然后再交由python进行对比,判断,最终将需要添加至iptables列表中的IP写入到 ...
- Minimum Increment to Make Array Unique LT945
Given an array of integers A, a move consists of choosing any A[i], and incrementing it by 1. Return ...
- Zookeeper系列2 原生API 以及核心特性watcher
原生API 增删改查询 public class ZkBaseTest { static final String CONNECT_ADDR = "192.168.0.120"; ...