*参照元 [#r4f55429] #backlinks *説明 [#w88cf56e] -パス: [[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 の値 **参考 [#hec79802] *実装 [#k318973c] #if __LINUX_ARM_ARCH__ >= 6 -armv6 以上の場合 --[[linux-2.6.33/__LINUX_ARM_ARCH__]] static inline int atomic_sub_return(int i, atomic_t *v) { unsigned long tmp; int result; smp_mb(); - --[[linux-2.6.33/smp_mb()]] __asm__ __volatile__("@ atomic_sub_return\n" "1: ldrex %0, [%2]\n" " sub %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_sub_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; } (略) #endif /* __LINUX_ARM_ARCH__ */ *コメント [#j0e77ea9]