- 追加された行はこの色です。
- 削除された行はこの色です。
*参照元 [#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]