[英]what does “static int function(…) __acquires(..) __releases(…){” mean?
我最近在Linux内核中得到了一段代码:
static int
fb_mmap(struct file *file, struct vm_area_struct * vma)
__acquires(&info->lock)
__releases(&info->lock)
{
...
}
令我困惑的是在"{"
之前的static int fb_mmap()
之后的两个__funtions,
a).
这两个__funtions的目的是什么?
b).
为什么在那个位置?
c).
为什么他们有前缀"__"
?
d).
还有其他类似的例子吗?
并非以一对括号结尾的所有内容都是函数(调用)。 在这种情况下,它们是参数化宏扩展。 宏定义为
#define __acquires(x) __attribute__((context(x,0,1)))
#define __releases(x) __attribute__((context(x,1,0)))
在内核构建树中的文件include/linux/compiler.h
中。
这些宏扩展到属性定义的目的是使用关于函数将获取(即锁定)和释放(即解锁)的锁定结构的信息来注释函数符号。 这些的目的尤其是调试锁定机制(Linux内核包含一些代码,允许它检测潜在的死锁情况并报告此情况)。
https://en.wikipedia.org/wiki/Sparse
__attribute__
是特定于GCC编译器的关键字,允许将属性分配给给定符号http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html#Function-Attributes
由于宏在文本级别进行了扩展,因此在编译器查看它之前,您的特定代码段的结果是实际编译器看到的结果
static int
fb_mmap(struct file *file, struct vm_area_struct * vma)
__attribute__((context(&info->lock,0,1)))
__attribute__((context(&info->lock,1,0)))
{
…
}
这些宏以双下划线__
开头,表示它们是编译器环境的一部分。 所有以一个或两个下划线开头的标识符都保留用于编译器环境实现。 对于Linux内核,因为Linux是一个操作系统内核(因为它根本不可用)使用标准库,所以很自然地定义它自己的编译器环境定义,它是私有的。 因此,两个下划线表明,这是编译器环境/实现特定的东西。
它们可能是使用#define
定义的宏。 您应该查找此类宏的定义并查看它们扩展到的内容。 它们可能扩展到一些pragma
器,给编译器提示 ; 他们可能会扩展到没有给开发人员或某些分析工具提示 。 意思可能会有所不同
这些是宏的定义为
# define __acquires(x) __attribute__((context(x,0,1)))
# define __releases(x) __attribute__((context(x,1,0)))
在Linux / include / linux / compiler.h中
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.