/* Implementing Schimmel's swap-atomic */ /* atomic_swap(&p, 1) will result * in p becoming 1 and the old * value of p getting returned. */ int atomic_swap(volatile unsigned int *addr, int val) { __asm__ __volatile__( "xchg %0, %1 \n\t" :"=r"(val), "=m"(*addr) :"0"(val), "m"(*addr) ); return val; } /* Value being incremented is 0 or * positive. */ void atomic_inc(volatile unsigned int *addr) { unsigned int val; while((val = swap_atomic(addr, -1)) == -1); *addr = (val + 1); } unsigned int atomic_read(volatile unsigned int *addr) { unsigned int val; while((val = *addr) == -1); return val; }