*参照元 [#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]

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS