無料Wikiサービス | デモページ
検索

アクセス数
最近のコメント
kprobe - ななし
ksetの実装 - スーパーコピー
カーネルスレッドとは - ノース
カーネルスレッドとは - nbyst
asmlinkageってなに? - ノース
asmlinkageってなに? - よろしく
はじめ - ノース
はじめ - ノース
はじめ - 楽打連動ユーザー
はじめ - 楽打連動ユーザー
Adsense
広告情報が設定されていません。

ミューテックス


ミューテックスの宣言は、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は、排他的アクセスとなります。

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
}




最終更新 2013/04/06 18:44:50 - north
(2013/04/06 18:44:50 作成)