Kevin Mills <[EMAIL PROTECTED]> wrote:
>I found the atomic_* functions in <machine/atomic.h>, but noticed that they
>have no return value. What I need is a function that increments/decrements
>the given value *and* returns the new value in an atomic operation. I
>suppose this is possible, yes? How would one modify the assembly to make
>this work?
Atomic decrement, in the Intel style:
long atomic_decrement(volatile long* address)
{
asm {
mov ecx, [address]
mov eax, -1
lock xadd [ecx], eax
dec eax
}
/* Return value in EAX */
}
An untested conversion into the GNU/AT&T style:
long atomic_decrement(volatile long* address)
{
asm("movl 8(%ebp),%ecx");
asm("movl $-1, %eax");
asm("lock xaddl %eax,(%ecx)");
asm("decl %eax");
/* Return value in %eax */
}
Deriving increment is straightforward.
I haven't looked at the GNU inline assembler notation for indicating
register usage. I'd be curious to see what is should look like.
Jan Mikkelsen
To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-hackers" in the body of the message