参照元†
- x86 の場合、カッコ内の数値はカウント値の変化
状態 | 異常 | write_lock 中 | read_lock 中 | ロックなし | 異常 |
カウント | < 0 | == 0(read_lock の最大) | < RW_LOCK_BIAS(=0x01000000) | == RW_LOCK_BIAS | > RW_LOCK_BIAS |
read_lock() | できない | できない | できる(-1) | できる(-1) | できる(-1) |
write_lock() | できない | できない | できない | できる、-RW_LOCK_BIAS | できない |
read_unlock() | できる(+1) | できる(+1) | できる(+1) | できる(+1) | できる(+1) |
write_unlock() | できる(+RW_LOCK_BIAS) | できる(+RW_LOCK_BIAS) | できる(+RW_LOCK_BIAS) | できる(+RW_LOCK_BIAS) | できる(+RW_LOCK_BIAS) |
- アンロック時は何もチェックしていないので、
ロックしていないのにアンロックするとロックの状態がおかしくなると思われる…。
- FIXME: スピンロックのデバッグ機能を使えば OK??
typedef struct {
arch_rwlock_t raw_lock;
#ifdef CONFIG_GENERIC_LOCKBREAK
unsigned int break_lock;
#endif
#ifdef CONFIG_DEBUG_SPINLOCK
unsigned int magic, owner_cpu;
void *owner;
#endif
#ifdef CONFIG_DEBUG_LOCK_ALLOC
struct lockdep_map dep_map;
#endif
} rwlock_t;
コメント†