*参照元 [#ie766313] #backlinks *説明 [#v98d0d71] -パス: 複数あり --汎用: [[linux-2.6.33/include/asm-generic/atomic.h]] --ARM 用: [[linux-2.6.33/atomic_sub_return(arm)]] --x86 用: [[linux-2.6.33/atomic_sub_return(x86)]] --ARM 用: [[linux-2.6.33/atomic_sub_return()(arm)]] --x86 用: [[linux-2.6.33/atomic_sub_return()(x86)]] -アトミック値から指定した値を減算し、減算後の値を返す。 --演算がアトミックに行われるのは、 24bit に収まる範囲内の値までである。 ---FIXME: なぜ??? --汎用処理は SMP 有効時に安全ではないため、 SMP を有効にする場合、各アーキテクチャで定義された関数が使用される。 **引数 [#x0b8e60a] -int i --減算する値 -atomic_t *v --減算対象のアトミック値 --[[linux-2.6.33/atomic_t]] **返り値 [#n37146b4] -int --減算後の v の値 **参考 [#w74de1f6] *実装 [#e312f3b8] #ifdef CONFIG_SMP -SMP が有効の時 --[[linux-2.6.33/CONFIG_SMP]] #error not SMP safe -SMP に対して安全ではないためコンパイルエラーにする。 #endif /** * atomic_sub_return - subtract integer from atomic variable * @i: integer value to subtract * @v: pointer of type atomic_t * * Atomically subtracts @i from @v and returns the result * Note that the guaranteed useful range of an atomic_t is only 24 bits. */ static inline int atomic_sub_return(int i, atomic_t *v) { unsigned long flags; int temp; local_irq_save(flags); -割り込みを禁止する。 --[[linux-2.6.33/local_irq_save()]] temp = v->counter; temp -= i; v->counter = temp; local_irq_restore(flags); -割り込み許可/禁止状態を元に戻す。 --[[linux-2.6.33/local_irq_restore()]] return temp; } *コメント [#w9620954]