ミューテックス
ミューテックスの宣言は、DECLARE_MUTEX/DECLARE_MUTEX_LOCKEマクロで行っています。このマクロは、__DECLARE_SEMAPHORE_GENERICマクロと引き継がれ、DECLARE_MUTEXの場合、semaphore->count=1、DECLARE_MUTEX_LOCKEの場合、semaphore->count=0のsemaphore構造体を返していて、内容はセマフォその物だと言う事です。
ちなみに、セマフォの取得するには、semaphore->countをデクリメントして、0以上ということです。従って、DECLARE_MUTEX_LOCKEマクロのsemaphore->count=0は、排他的アクセスとなります。
ちなみに、セマフォの取得するには、semaphore->countをデクリメントして、0以上ということです。従って、DECLARE_MUTEX_LOCKEマクロのsemaphore->count=0は、排他的アクセスとなります。
struct semaphore { atomic_t count; int sleepers; wait_queue_head_t wait; #if WAITQUEUE_DEBUG long __magic; #endif }; #define DECLARE_MUTEX(name) __DECLARE_SEMAPHORE_GENERIC(name,1) #define DECLARE_MUTEX_LOCKED(name) __DECLARE_SEMAPHORE_GENERIC(name,0) #define __DECLARE_SEMAPHORE_GENERIC(name,count) \ struct semaphore name = __SEMAPHORE_INITIALIZER(name,count) #define __SEMAPHORE_INITIALIZER(name,count) \ { ATOMIC_INIT(count), 0, __WAIT_QUEUE_HEAD_INITIALIZER((name).wait) \ __SEM_DEBUG_INIT(name) }
補足
いわゆるセマフォの定義は、DECLARE_MUTEXで定義したsemaphore構造体を、sema_init()で、sem->countを初期化することで行っているようです。static inline void sema_init (struct semaphore *sem, int val) { atomic_set(&sem->count, val); sem->sleepers = 0; init_waitqueue_head(&sem->wait); #if WAITQUEUE_DEBUG sem->__magic = (int)&sem->__magic; #endif }