X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/bc1d617aac6575b9764b3f8195504ee79c978f49..50ccc908dc4e6376de91edd7f74018898fd690b1:/include/wx/atomic.h diff --git a/include/wx/atomic.h b/include/wx/atomic.h index 83b285cf7f..829e29bdd3 100644 --- a/include/wx/atomic.h +++ b/include/wx/atomic.h @@ -25,46 +25,50 @@ #if wxUSE_THREADS -#if defined(__WXMSW__) +#if defined(HAVE_GCC_ATOMIC_BUILTINS) -// include standard Windows headers -#include "wx/msw/wrapwin.h" +// NB: we intentionally don't use Linux's asm/atomic.h header, because it's +// an internal kernel header that doesn't always work in userspace: +// http://bugs.mysql.com/bug.php?id=28456 +// http://golubenco.org/blog/atomic-operations/ inline void wxAtomicInc (wxUint32 &value) { - InterlockedIncrement ((LONG*)&value); + __sync_fetch_and_add(&value, 1); } inline wxUint32 wxAtomicDec (wxUint32 &value) { - return InterlockedDecrement ((LONG*)&value); + return __sync_sub_and_fetch(&value, 1); } -#elif defined(__WXMAC__) || defined(__DARWIN__) -#include "libkern/OSAtomic.h" +#elif defined(__WXMSW__) + +// include standard Windows headers +#include "wx/msw/wrapwin.h" + inline void wxAtomicInc (wxUint32 &value) { - OSAtomicIncrement32 ((int32_t*)&value); + InterlockedIncrement ((LONG*)&value); } inline wxUint32 wxAtomicDec (wxUint32 &value) { - return OSAtomicDecrement32 ((int32_t*)&value); + return InterlockedDecrement ((LONG*)&value); } -#elif defined(__LINUX__) - -#include +#elif defined(__WXMAC__) || defined(__DARWIN__) +#include "libkern/OSAtomic.h" inline void wxAtomicInc (wxUint32 &value) { - atomic_inc ((atomic_t*)&value); + OSAtomicIncrement32 ((int32_t*)&value); } inline wxUint32 wxAtomicDec (wxUint32 &value) { - return atomic_dec_and_test ((atomic_t*)&value) ? 0 : 1; + return OSAtomicDecrement32 ((int32_t*)&value); } #elif defined (__SOLARIS__)