• 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.




  • 相关阅读:
    追踪路由信息
    Windows Server 2008 R2远程桌面服务安装配置和授权激活
    CentOS 7 下挂载NTFS盘及开机自动挂载
    functools 之 partial(偏函数)
    Flask-WTForms 简单使用
    Flask-Session 简单使用
    通过decorators = [,] 的形式给类中的所有方法添加装饰器
    Python __dict__属性详解
    面向对象的 __slots__
    related_name和related_query_name举例区别
  • 原文地址:https://www.cnblogs.com/ztguang/p/12645915.html
Copyright © 2020-2023  润新知