首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >自旋锁初始化函数

自旋锁初始化函数
EN

Stack Overflow用户
提问于 2018-09-28 16:48:38
回答 1查看 1.8K关注 0票数 1

要在内核v4.19-rc5中初始化自旋锁,必须使用定义如下的spin_lock_init宏:

代码语言:javascript
运行
复制
#define spin_lock_init(_lock)               \
do {    \
       spinlock_check(_lock);               \
       raw_spin_lock_init(&(_lock)->rlock);     \
} while (0)

函数spinlock_check(_lock)只返回&lock->rlockThis文章解释了这一点:

spinlock_check的实现非常简单,这个函数只返回给定自旋锁的raw_spinlock_t,以确保我们得到的是正常的原始自旋锁

我不明白这个函数是如何执行检查的。我期望在ckeck函数中包含一些if语句。很抱歉,我对内核编程是个新手。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-28 17:23:26

它不需要任何if语句,因为它用于编译时检查。

你可以看到here大多数自旋锁定操作都被定义为宏,所以它们不能限制参数的类型。

考虑以下示例:

代码语言:javascript
运行
复制
struct not_a_spinlock {
    raw_spinlock_t rlock;
};

没有spinlock_check,我可以使用spin_lock_init来初始化它:

代码语言:javascript
运行
复制
struct not_a_spinlock spin;
spin_lock_init(&spin);

但多亏了spinlock_check,这将不会起作用。这使得这些宏的类型受到限制,因此它们的行为更像是函数。

它返回&lock->rlock的原因是为了方便-它的返回值可以传递给下一个函数。

因此,将示例中的宏重写为:

代码语言:javascript
运行
复制
#define spin_lock_init(_lock)                         \
do {                                                  \
       raw_spin_lock_init(spinlock_check(_lock));     \
} while (0)

类似的技术可以用于宏,以在一定程度上限制它们的参数类型,如所示的here

代码语言:javascript
运行
复制
#define min(x, y) ({                \
    typeof(x) _min1 = (x);          \
    typeof(y) _min2 = (y);          \
    (void) (&_min1 == &_min2);      \
    _min1 < _min2 ? _min1 : _min2; })
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52551594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档