我在https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/atomic.h
中找到了下面的代码static __always_inline bool arch_atomic_sub_and_test(int i, atomic_t *v)
{
return GEN_BINARY_RMWcc(LOCK_PREFIX "subl", v->counter, e, "er", i);
}
#define arch_atomic_sub_and_test arch_atomic_sub_and_test
#define
真正做什么?什么时候需要这样做?
答案 0 :(得分:14)
有时候Linux内核中的某些体系结构不提供某些功能,例如arch_atomic_sub_and_test
。这样就可以有条件地提供这些功能,而不会破坏其他体系结构。
#define
允许您使用#ifdef
测试该功能是否存在:
#ifdef arch_atomic_sub_and_test
// use arch_atomic_sub_and_test
#else
// some other equivalent code
#endif
,或者如果该功能不可用,则可用于出错:
#ifndef arch_atomic_sub_and_test
# error "arch_atomic_sub_and_test not available"
#endif
例如,这是在Linux内核中的用法(来自include/asm-generic/atomic-instrumented.h
):
#ifdef arch_atomic_sub_and_test
#define atomic_sub_and_test atomic_sub_and_test
static __always_inline bool atomic_sub_and_test(int i, atomic_t *v)
{
kasan_check_write(v, sizeof(*v));
return arch_atomic_sub_and_test(i, v);
}
#endif