/* 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;
}

		
