linux-2.6.33/atomic_add_return()
#if __LINUX_ARM_ARCH__ >= 6
static inline int atomic_add_return(int i, atomic_t *v) { unsigned long tmp; int result; 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 */
#ifdef CONFIG_SMP #error SMP not supported on pre-ARMv6 CPUs
#endif static inline int atomic_add_return(int i, atomic_t *v) { unsigned long flags; int val; raw_local_irq_save(flags);
val = v->counter; v->counter = val += i; raw_local_irq_restore(flags);
return val; }