[[linux-2.6.33/atomic_add_return()]]

*参照元 [#xa5df9ae]
#backlinks

*説明 [#sc0aafeb]
-パス: [[linux-2.6.33/arch/arm/include/asm/atomic.h]]

-アトミック値から指定した値を加算し、加算後の値を返す。
--ARMv6 以前の場合は SMP が使用できないので、
SMP を有効にするとコンパイルエラーが起きるようにしている。


**引数 [#x0b8e60a]
-int i
--加算する値
-atomic_t *v
--加算対象のアトミック値
--[[linux-2.6.33/atomic_t]]


**返り値 [#n37146b4]
-int
--加算後の v の値


**参考 [#w74de1f6]


*実装 [#d3cbd5c6]

 #if __LINUX_ARM_ARCH__ >= 6
-armv6 以上の場合
--[[linux-2.6.33/__LINUX_ARM_ARCH__]]

 static inline int atomic_add_return(int i, atomic_t *v)
 {
 	unsigned long tmp;
 	int result;
 
 	smp_mb();
 
-
--[[linux-2.6.33/smp_mb()]]

 	__asm__ __volatile__("@ atomic_add_return\n"
 "1:	ldrex	%0, [%2]\n"
 "	add	%0, %0, %3\n"
 "	strex	%1, %0, [%2]\n"
 "	teq	%1, #0\n"
 "	bne	1b"
 	: "=&r" (result), "=&r" (tmp)
 	: "r" (&v->counter), "Ir" (i)
 	: "cc");
 
 	smp_mb();
 
 	return result;
 }
 
 (略)
 
 #else /* ARM_ARCH_6 */
-armv6 以前の場合

 #ifdef CONFIG_SMP
 #error SMP not supported on pre-ARMv6 CPUs
-armv6 以前の場合、SMP に対応していないためコンパイルエラーとする。
--[[linux-2.6.33/CONFIG_SMP]]

 #endif
 
 static inline int atomic_add_return(int i, atomic_t *v)
 {
 	unsigned long flags;
 	int val;
 
 	raw_local_irq_save(flags);
-
--[[linux-2.6.33/raw_local_irq_save()]]

 	val = v->counter;
 	v->counter = val += i;
 	raw_local_irq_restore(flags);
 
-
--[[linux-2.6.33/raw_local_irq_restore()]]

 	return val;
 }


*コメント [#o9a0474e]

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