[英]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.