From bdff2236079c9b41b32d2be24534387a9bcbf93d Mon Sep 17 00:00:00 2001 From: counterpoint Date: Fri, 17 Oct 2014 14:10:16 +0100 Subject: [PATCH] Modify atomic_add to use built in GCC function where available. Correct comments. --- server/core/atomic.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) 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 }