diff --git a/server/core/atomic.c b/server/core/atomic.c index b14e1ccb1..c1bd5b244 100644 --- a/server/core/atomic.c +++ b/server/core/atomic.c @@ -29,23 +29,32 @@ */ /** - * Implementation of an atomic add operation for the X86 processor. + * Implementation of an atomic add operation for the GCC environment, or the + * X86 processor. If we are working within GNU C then we can use the GCC + * atomic add built in function, which is portable across platforms that + * implement GCC. Otherwise, this function currently supports only X86 + * architecture (without further development). + * * Adds a value to the contents of a location pointed to by the first parameter. - * The add operation is atomic and the return value is the value stored in the location - * prior to the operation. The number that is added may be signed, therefore atomic_subtract - * is merely an atomic add with a negative value. + * The add operation is atomic and the return value is the value stored in the + * location prior to the operation. The number that is added may be signed, + * therefore atomic_subtract is merely an atomic add with a negative value. * * @param variable Pointer the the variable to add to * @param value Value to be added - * @return Pointer to the value of variable before the add occured + * @return The value of variable before the add occurred */ int atomic_add(int *variable, int value) { +#ifdef __GNUC__ + return (int) __sync_fetch_and_add (variable, value); +#else asm volatile( "lock; xaddl %%eax, %2;" :"=a" (value) : "a" (value), "m" (*variable) : "memory" ); return value; +#endif }