*参照元 [#o99c1287] #backlinks *説明 [#uc29799d] -パス: 複数あり --汎用: [[linux-2.6.33/include/asm-generic/atomic.h]] --ARM 用: [[linux-2.6.33/atomic_add_return(arm)]] --x86 用: [[linux-2.6.33/atomic_add_return(x86)]] --ARM 用: [[linux-2.6.33/atomic_add_return()(arm)]] --x86 用: [[linux-2.6.33/atomic_add_return()(x86)]] -アトミック値から指定した値を加算し、加算後の値を返す。 --演算がアトミックに行われるのは、 24bit に収まる範囲内の値までである。 ---FIXME: なぜ??? --汎用処理は SMP 有効時に安全ではないため、 SMP を有効にする場合、各アーキテクチャで定義された関数が使用される。 **引数 [#x0b8e60a] -int i --加算する値 -atomic_t *v --加算対象のアトミック値 --[[linux-2.6.33/atomic_t]] **返り値 [#n37146b4] -int --加算後の v の値 **参考 [#w74de1f6] *実装 [#d3cbd5c6] #ifdef CONFIG_SMP -SMP が有効の時 --[[linux-2.6.33/CONFIG_SMP]] #error not SMP safe -SMP に対して安全ではないためコンパイルエラーにする。 #endif /** * atomic_add_return - add integer to atomic variable * @i: integer value to add * @v: pointer of type atomic_t * * Atomically adds @i to @v and returns the result * Note that the guaranteed useful range of an atomic_t is only 24 bits. */ static inline int atomic_add_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; } *コメント [#bf6262e6]