*参照元 [#t32f6685] #backlinks *説明 [#sec810a5] -パス: 複数あり -[[linux-2.6.33/include/linux/spinlock_api_smp.h]] --CONFIG_GENERIC_LOCKBREAK 未定義時、 または CONFIG_DEBUG_LOCK_ALLOC 定義時 -CONFIG_GENERIC_LOCKBREAK 未定義時、 または CONFIG_DEBUG_LOCK_ALLOC 定義時の場合: [[linux-2.6.33/include/linux/spinlock_api_smp.h]] --[[linux-2.6.33/CONFIG_GENERIC_LOCKBREAK]] --[[linux-2.6.33/CONFIG_DEBUG_LOCK_ALLOC]] -[[linux-2.6.33/kernel/spinlock.c]] --それ以外 -それ以外の場合: [[linux-2.6.33/kernel/spinlock.c]] -FIXME: これは何? --説明 **引数 [#za5a971e] -raw_spinlock_t *lock -- **返り値 [#x1b607e9] -unsigned long -- **参考 [#kc3d16a6] -BUILD_LOCK_OPS() を使う場合に一緒に定義される関数 --[[linux-2.6.33/__raw_spin_lock()]] --[[linux-2.6.33/__raw_spin_lock_irq()]] --[[linux-2.6.33/__raw_spin_lock_irqsave()]] --[[linux-2.6.33/__raw_spin_lock_bh()]] *実装 [#ja03a4b7] **CONFIG_GENERIC_LOCKBREAK 未定義時、 [#ufbb03dd] または CONFIG_DEBUG_LOCK_ALLOC 定義時 static inline unsigned long __raw_spin_lock_irqsave(raw_spinlock_t *lock) { unsigned long flags; local_irq_save(flags); - --[[linux-2.6.33/local_irq_save()]] preempt_disable(); - --[[linux-2.6.33/preempt_disable()]] spin_acquire(&lock->dep_map, 0, 0, _RET_IP_); - --[[linux-2.6.33/spin_acquire()]] /* * On lockdep we dont want the hand-coded irq-enable of * do_raw_spin_lock_flags() code, because lockdep assumes * that interrupts are not re-enabled during lock-acquire: */ #ifdef CONFIG_LOCKDEP LOCK_CONTENDED(lock, do_raw_spin_trylock, do_raw_spin_lock); - --[[linux-2.6.33/LOCK_CONTENDED()]] #else do_raw_spin_lock_flags(lock, &flags); - --[[linux-2.6.33/do_raw_spin_lock_flags()]] #endif return flags; } **それ以外 [#nd08f7e8] BUILD_LOCK_OPS(spin, raw_spinlock); -プリエンプションに対応したロック関数を定義する。 --[[linux-2.6.33/BUILD_LOCK_OPS()]] *コメント [#tbcc3bbe]