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