]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/atomic.h
template class WXDLLIMPEXP_FWD_XRC wxVector<wxXmlResourceHandler *>;
[wxWidgets.git] / include / wx / atomic.h
index 83b285cf7fc54ef890503ee3777ba215e6ff1769..829e29bdd34fff719534cad151c8bdec736eb3de 100644 (file)
 
 #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 <asm/atomic.h>
+#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__)