同じ名前の関数にマクロを定義するのはなぜですか?


12

私は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本当に何をしますか?いつそうする必要がありますか?

回答:


15

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)での使用方法です。

#if defined(arch_atomic_sub_and_test)
static 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);
}
#define atomic_sub_and_test atomic_sub_and_test
#endif
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.