X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fstructure%2FSGAtomic.cxx;h=e7dd76c29a3883c38aaf975e75487f8166bd49cc;hb=58c7edfed6a848f555bb0eaa65593162b5a206ce;hp=3505fabf601b2c9ca57eccf0f8e6f48ea3285b51;hpb=11b16b8a86d49743a2f29570871bd8adccb51890;p=simgear.git diff --git a/simgear/structure/SGAtomic.cxx b/simgear/structure/SGAtomic.cxx index 3505fabf..e7dd76c2 100644 --- a/simgear/structure/SGAtomic.cxx +++ b/simgear/structure/SGAtomic.cxx @@ -1,6 +1,6 @@ /* -*-c++-*- * - * Copyright (C) 2005-2006 Mathias Froehlich + * Copyright (C) 2005-2009 Mathias Froehlich * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -20,7 +20,7 @@ #include "SGAtomic.hxx" -#if defined(SGATOMIC_USE_GCC4_BUILTINS) && defined(__i386__) +#if defined(SGATOMIC_USE_GCC4_BUILTINS) && defined (__i386__) // Usually the apropriate functions are inlined by gcc. // But if gcc is called with something aequivalent to -march=i386, @@ -39,7 +39,7 @@ unsigned __sync_sub_and_fetch_4(volatile void *ptr, unsigned value) : "=r" (result), "=m" (*mem) : "0" (-value), "m" (*mem) : "memory"); - return result; + return result - value; } unsigned __sync_add_and_fetch_4(volatile void *ptr, unsigned value) @@ -50,7 +50,19 @@ unsigned __sync_add_and_fetch_4(volatile void *ptr, unsigned value) : "=r" (result), "=m" (*mem) : "0" (value), "m" (*mem) : "memory"); - return result; + return result + value; +} + +unsigned __sync_bool_compare_and_swap_4(volatile void *ptr, + unsigned oldValue, unsigned newValue) +{ + register volatile unsigned* mem = reinterpret_cast(ptr); + unsigned before; + __asm__ __volatile__("lock; cmpxchg{l} {%1,%2|%1,%2}" + : "=a"(before) + : "q"(newValue), "m"(*mem), "0"(oldValue) + : "memory"); + return before == oldValue; } void __sync_synchronize()