ミューテックス
ミューテックスの宣言は、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
}






