Re: Atomic operations

From: Brian Gerst (bgerst@didntduck.org)
Date: Mon Jun 03 2002 - 13:39:23 EST


Gregory Giguashvili wrote:
>
> Hello,
>
> I wonder if someone can help me to change the behaviour of the atomic
> functions available in <asm/atomic.h> include file. The operations I need to
> implement are described below:
>
> atomic_t test_and_set (int i, atomic_t* v)
> {
> atomic_t old = *v;
> v->counter = i;
> return old;
> }

What you have coded is really an exchange, not a test. Here is the asm
equivalent of what you coded:

int atomic_xchg(int i, atomic_t *v)
{
        int ret;
        __asm__("xchgl %1,%0"
                : "=m" (v->counter), "=r" (ret)
                : "0" (v->counter), "1" (i));
        return ret;
}

>
> atomic_t test_then_add (int i, atomic_t* v)
> {
> atomic_t old = *v;
> v->counter += i;
> return old;
> }

int atomic_xadd(int i, atomic_t *v)
{
        int ret;
        __asm__(LOCK "xaddl %1,%0"
                : "=m" (v->counter), "=r" (ret)
                : "0" (v->counter), "1" (i));
        return ret;
}

This one only works on 486+, but there are practically no real 386 SMP
systems.

--

Brian Gerst - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Fri Jun 07 2002 - 22:00:16 EST