0025215: Porting to Android - fix minor issues
[occt.git] / src / Standard / Standard_Atomic.hxx
index 00a23c8..a5b5944 100644 (file)
 #ifndef _Standard_Atomic_HeaderFile
 #define _Standard_Atomic_HeaderFile
 
-#if defined(__ANDROID__)
-  #include <sys/atomics.h>
-#endif
-
 //! Increments atomically integer variable pointed by theValue
 //! and returns resulting incremented value.
 inline int Standard_Atomic_Increment (volatile int* theValue);
@@ -59,7 +55,7 @@ int Standard_Atomic_Decrement (volatile int* theValue)
   return __sync_sub_and_fetch (theValue, 1);
 }
 
-#elif defined(_WIN32) || defined(__WIN32__)
+#elif defined(_WIN32)
 extern "C" {
   long _InterlockedIncrement (volatile long* lpAddend);
   long _InterlockedDecrement (volatile long* lpAddend);
@@ -100,20 +96,22 @@ int Standard_Atomic_Decrement (volatile int* theValue)
 }
 
 #elif defined(__ANDROID__)
+
 // Atomic operations that were exported by the C library didn't
 // provide any memory barriers, which created potential issues on
 // multi-core devices. Starting from ndk version r7b they are defined as
 // inlined calls to GCC sync builtins, which always provide a full barrier.
 // It is strongly recommended to use newer versions of ndk.
+#include <sys/atomics.h>
 
 int Standard_Atomic_Increment (volatile int* theValue)
 {
-  return __atomic_inc (theValue);
+  return __atomic_inc (theValue) + 1; // analog of __sync_fetch_and_add
 }
 
 int Standard_Atomic_Decrement (volatile int* theValue)
 {
-  return __atomic_dec (theValue);
+  return __atomic_dec (theValue) - 1; // analog of __sync_fetch_and_sub
 }
 
 #elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64))