*参照元 [#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]