*参照元 [#nbade55f] #backlinks *説明 [#v6c30ab4] -パス: [[linux-2.6.33/include/linux/rwlock_types.h]] -FIXME: これは何? --説明 **参考 [#n8f27d4e] -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?? *実装 [#ba43b9c3] typedef struct { arch_rwlock_t raw_lock; - --[[linux-2.6.33/arch_rw_lock_t]] #ifdef CONFIG_GENERIC_LOCKBREAK - --[[linux-2.6.33/CONFIG_GENERIC_LOCKBREAK]] unsigned int break_lock; #endif #ifdef CONFIG_DEBUG_SPINLOCK - --[[linux-2.6.33/CONFIG_DEBUG_SPINLOCK]] unsigned int magic, owner_cpu; void *owner; #endif #ifdef CONFIG_DEBUG_LOCK_ALLOC - --[[linux-2.6.33/CONFIG_DEBUG_LOCK_ALLOC]] struct lockdep_map dep_map; - --[[linux-2.6.33/lockdep_map]] #endif } rwlock_t; *コメント [#c5c3bd80]