zoukankan      html  css  js  c++  java
  • what does “static int function(…) __acquires(..) __releases(…){” mean?


    http://stackoverflow.com/questions/21018778/what-does-static-int-function-acquires-releases-mean


    I recently got a snippet of code in Linux kernel:

    static int
    fb_mmap(struct file *file, struct vm_area_struct * vma)
    __acquires(&info->lock)
    __releases(&info->lock)
    {
    ...
    }

    What confused me is the two __funtions following static int fb_mmap() right before "{",

    a).What are the purpose of the two __funtions?

    b).Why in that position?

    c).Why do they have the prefix "__"?

    d).Is there other examples similar to this?

    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


    Not everything ending with a pair of parenthesis is a function (call). In this case they are parameterized macro expansions. The macros are defined as

    #define __acquires(x)  __attribute__((context(x,0,1)))
    #define __releases(x)  __attribute__((context(x,1,0)))

    in file include/linux/compiler.h in the kernel build tree.

    The purpose of those macros expanding into attribute definitions is to annotate the function symbols with information about which locking structures the function will acquire (i.e. lock) and release (i.e. unlock). The purpose of those in particular is debugging locking mechanisms (the Linux kernel contains some code that allows it to detect potential deadlock situations and report on this).

    https://en.wikipedia.org/wiki/Sparse

    __attribute__ is a keyword specific to the GCC compiler, that allows to assign, well, attributes to a given symbolhttp://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html#Function-Attributes

    Since macros are expanded at the text level, before the compiler is even looking at it, the result for your particular snippet, that the actual compilers sees would be

    static int
    fb_mmap(struct file *file, struct vm_area_struct * vma)
    __attribute__((context(&info->lock,0,1)))
    __attribute__((context(&info->lock,1,0)))
    {
    
    }

    Those macros start with a double underscore __ to indicate, that they are part of the compiler environment. All identifiers starting with one or two underscores are reserved for the compiler environment implementation. In the case of the Linux kernel, because Linux is a operating system kernel that does not (because it simply is not availible) use the standard library, it's natural for it, do define it's own compiler environment definitions, private to it. Hence the two underscores to indicate, that this is compiler environment/implementation specific stuff.




  • 相关阅读:
    iOS:TabBarController 显示/隐藏第一级页面的TabBar
    iOS : Blur Effect
    ASIHTTPRequest / ASIFormDataRequest
    Xcode :Missing file warnings
    Axure设计软件下载安装及注册
    windows服务更改配置文件
    sql server 清理数据库日志
    sql server 随机生成布尔值
    sql server 授权相关命令
    用VS2015创建ASP.NET Web Forms 应用程序
  • 原文地址:https://www.cnblogs.com/ztguang/p/12645915.html
Copyright © 2011-2022 走看看