c - spinlock_check() 函数的使用
问题描述
我对宏中spinlock_check()
使用的函数有疑问。spin_lock_init()
的代码spinlock_check
写在下面,它返回 rlock 的地址
static __always_inline raw_spinlock_t *spinlock_check(spinlock_t *lock)
{
return &lock->rlock;
}
它在宏中使用spin_lock_init
。这个宏的代码:
#define spin_lock_init(_lock) \
do { \
spinlock_check(_lock); \
raw_spin_lock_init(&(_lock)->rlock); \
} while (0)
我在这里看到了一个关于这个话题的问题。但我不太明白,我想以我的方式表达怀疑。
是spin_lock_init()
宏但spinlock_check()
不是宏。它是一个内联函数。所以我认为这里不可能发生一些编译魔法,但我希望在执行这些指令期间会有一些魔法。有什么作用spinlock_check()
?因为没有使用spinlock_check()
函数的返回值。即使spinlock_check()
返回一些东西,下一步无论如何都会被执行。因为我在其中一个文件中看到了它的用法,我认为它与 min(x, y) 宏不同。
这是我发现的用法
#ifdef CONFIG_NUMA
static void do_numa_crng_init(struct work_struct *work)
{
int i;
struct crng_state *crng;
struct crng_state **pool;
pool = kcalloc(nr_node_ids, sizeof(*pool), GFP_KERNEL|__GFP_NOFAIL);
for_each_online_node(i) {
crng = kmalloc_node(sizeof(struct crng_state),
GFP_KERNEL | __GFP_NOFAIL, i);
spin_lock_init(&crng->lock);
crng_initialize(crng);
pool[i] = crng;
}
mb();
if (cmpxchg(&crng_node_pool, NULL, pool)) {
for_each_node(i)
kfree(pool[i]);
kfree(pool);
}
}
所以这里crng
是动态分配的。假设我错过了kmalloc
代码,这意味着我没有为其分配内存,crng
但我仍然使用了宏 spin_lock_init(crng)。现在这个spinlock_check()
功能有什么好处?不是 afterspinlock_check()
函数raw_spin_lock_init
自动执行吗?
如果它要执行,那么spinlock_check()
函数的用途是什么?应该有什么意思,但我想不通。
解决方案
您缺少的是在运行时spinlock_check()
不执行任何检查。这就是为什么它的返回值被忽略的原因。该指令预计将在优化器编译期间删除。
那还有用吗?是的!其目的是在编译时确保其参数的类型为spinlock_t *
. 如果您不将指针spinlock_t
作为参数提供给spin_lock_init()
,您将触发编译错误。
推荐阅读
- python - 有没有办法可以替换/删除字符串中除某些短语之外的所有内容?
- vue.js - 如何根据条件显示选择?(元素-ui表)
- drupal-8 - 使用暴露过滤器时如何在 drupal 8 页面管理器中更改 URL
- ios - iOS中的颤振audio_service依赖问题
- swift - UILabel 上显示的纬度和经度
- android - 如何比较或验证不覆盖 equals 方法的对象?
- php - 有没有一种按数组顺序执行函数的方法
- ruby-on-rails - 如何获取结茧的索引值?
- ios - 主应用程序目标和应用程序的扩展版本号应该相同吗?
- c++ - std::ifstream 将文件读取为 BYTE (unsigned char) 而不是 char