*参照元 [#n0b87a22]
#backlinks

*説明 [#y4422dce]
-パス: [[linux-2.6.33/include/linux/spinlock_types.h]]

-スピンロック

-特徴
--1人しかロック状態に入れない。
--ロック状態のスピンロックに対して、
ロックを試みるとロックが解除されるまでビジーウェイトする。
--再帰的にロックできない。デッドロックする。
--所有権は管理しない。ロックしたコンテキスト以外でもアンロック可能。


**参考 [#c43444fd]


*実装 [#j35ef517]
 typedef struct spinlock {
 	union {
 		struct raw_spinlock rlock;
 
-スピンロックの実体
--ここだけなぜか struct raw_spinlock を使っているが、
他の場所では raw_spinlock_t を使う。
--[[linux-2.6.33/raw_spinlock_t]]

 #ifdef CONFIG_DEBUG_LOCK_ALLOC
-ロック状態のスピンロックを free してしまうバグを検知する場合
--[[linux-2.6.33/CONFIG_DEBUG_LOCK_ALLOC]]

 # define LOCK_PADSIZE (offsetof(struct raw_spinlock, dep_map))
-
--[[linux-2.6.33/offsetof()]]

 (略)
 		struct {
 			u8 __padding[LOCK_PADSIZE];
-LOCK_PADSIZE は raw_spinlock_t のうち、
dep_map のオフセット位置までのサイズである。
--[[linux-2.6.33/LOCK_PADSIZE]]

 			struct lockdep_map dep_map;
-dep_map へのショートカットである。
--つまり
-rlock.dep_map へのショートカットである。
--過去の互換性のためだと思われるが詳細は不明。
--ショートカットの意味
 spinlock_t s;
 のとき
 s.rawlock.dep_map と s.dep_map は一緒の領域を指す。
 としたとき、
 s.rlock.dep_map と s.dep_map は全く同じメモリ領域を指す。
--[[linux-2.6.33/lockdep_map]]

 		};
 #endif
 	};
 } spinlock_t;


*コメント [#v3100b21]

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS