More fixes for compilation on Visual Studio
authorSam Lantinga <slouken@libsdl.org>
Tue, 25 Jan 2011 18:02:41 -0800
changeset 5097 b938ad843e52
parent 5096 e4301cde4de1
child 5098 470ede30189c
More fixes for compilation on Visual Studio
include/SDL_atomic.h
src/atomic/SDL_spinlock.c
--- a/include/SDL_atomic.h	Tue Jan 25 17:44:17 2011 -0800
+++ b/include/SDL_atomic.h	Tue Jan 25 18:02:41 2011 -0800
@@ -127,7 +127,7 @@
 void _ReadWriteBarrier(void);
 #pragma intrinsic(_ReadWriteBarrier)
 #define SDL_CompilerBarrier()   _ReadWriteBarrier()
-#elif __GNUC__
+#elif defined(__GNUC__)
 #define SDL_CompilerBarrier()   __asm__ __volatile__ ("" : : : "memory")
 #else
 #define SDL_CompilerBarrier()   \
@@ -139,7 +139,7 @@
  */
 #ifndef SDL_DISABLE_ATOMIC_INLINE
 
-#if HAVE_MSC_ATOMICS
+#ifdef HAVE_MSC_ATOMICS
 
 #define SDL_AtomicSet(a, v)     _InterlockedExchange((long*)&(a)->value, (v))
 #define SDL_AtomicAdd(a, v)     _InterlockedExchangeAdd((long*)&(a)->value, (v))
@@ -151,7 +151,7 @@
 #define SDL_AtomicCASPtr(a, oldval, newval) (_InterlockedCompareExchangePointer((a), (newval), (oldval)) == (oldval))
 #endif
 
-#elif __MACOSX__
+#elif defined(__MACOSX__)
 #include <libkern/OSAtomic.h>
 
 #define SDL_AtomicCAS(a, oldval, newval) OSAtomicCompareAndSwap32Barrier((oldval), (newval), &(a)->value)
@@ -161,7 +161,7 @@
 #define SDL_AtomicCASPtr(a, oldval, newval) OSAtomicCompareAndSwap64Barrier((int64_t)(oldval), (int64_t)(newval), (int64_t*)(a))
 #endif
 
-#elif HAVE_GCC_ATOMICS
+#elif defined(HAVE_GCC_ATOMICS)
 
 #define SDL_AtomicSet(a, v)     __sync_lock_test_and_set(&(a)->value, v)
 #define SDL_AtomicAdd(a, v)     __sync_fetch_and_add(&(a)->value, v)
@@ -183,31 +183,43 @@
 #endif
 
 /**
+ * \brief Set an atomic variable to a new value if it is currently an old value.
+ *
+ * \return SDL_TRUE if the atomic variable was set, SDL_FALSE otherwise.
+ *
+ * \note If you don't know what this function is for, you shouldn't use it!
+*/
+#ifndef SDL_AtomicCAS
+#define SDL_AtomicCAS SDL_AtomicCAS_
+#endif
+extern DECLSPEC SDL_bool SDLCALL SDL_AtomicCAS_(SDL_atomic_t *a, int oldval, int newval);
+
+/**
  * \brief Set an atomic variable to a value.
  *
  * \return The previous value of the atomic variable.
  */
 #ifndef SDL_AtomicSet
-#define SDL_AtomicSet(a, v) \
-({                              \
-    int _value;                 \
-    do {                        \
-        _value = (a)->value;    \
-    } while (!SDL_AtomicCAS(a, _value, (v))); \
-    _value;                     \
-})
+static __inline__ int SDL_AtomicSet(SDL_atomic_t *a, int v)
+{
+    int value;
+    do {
+        value = a->value;
+    } while (!SDL_AtomicCAS(a, value, v));
+    return value;
+}
 #endif
 
 /**
  * \brief Get the value of an atomic variable
  */
 #ifndef SDL_AtomicGet
-#define SDL_AtomicGet(a)        \
-({                              \
-    int _value = (a)->value;    \
-    SDL_CompilerBarrier();      \
-    _value;                     \
-})
+static __inline__ int SDL_AtomicGet(SDL_atomic_t *a)
+{
+    int value = a->value;
+    SDL_CompilerBarrier();
+    return value;
+}
 #endif
 
 /**
@@ -218,14 +230,14 @@
  * \note This same style can be used for any number operation
  */
 #ifndef SDL_AtomicAdd
-#define SDL_AtomicAdd(a, v)     \
-({                              \
-    int _value;                 \
-    do {                        \
-        _value = (a)->value;    \
-    } while (!SDL_AtomicCAS(a, _value, (_value + (v)))); \
-    _value;                     \
-})
+static __inline__ int SDL_AtomicAdd(SDL_atomic_t *a, int v)
+{
+    int value;
+    do {
+        value = a->value;
+    } while (!SDL_AtomicCAS(a, value, (value + v)));
+    return value;
+}
 #endif
 
 /**
@@ -246,46 +258,6 @@
 #endif
 
 /**
- * \brief Set an atomic variable to a new value if it is currently an old value.
- *
- * \return SDL_TRUE if the atomic variable was set, SDL_FALSE otherwise.
- *
- * \note If you don't know what this function is for, you shouldn't use it!
-*/
-#ifndef SDL_AtomicCAS
-#define SDL_AtomicCAS SDL_AtomicCAS_
-#endif
-extern DECLSPEC SDL_bool SDLCALL SDL_AtomicCAS_(SDL_atomic_t *a, int oldval, int newval);
-
-/**
- * \brief Set a pointer to a value atomically.
- *
- * \return The previous value of the pointer.
- */
-#ifndef SDL_AtomicSetPtr
-#define SDL_AtomicSetPtr(a, v)  \
-({                              \
-    void* _value;               \
-    do {                        \
-        _value = *(a);          \
-    } while (!SDL_AtomicCASPtr(a, _value, (v))); \
-    _value;                     \
-})
-#endif
-
-/**
- * \brief Get the value of a pointer atomically.
- */
-#ifndef SDL_AtomicGetPtr
-#define SDL_AtomicGetPtr(a)     \
-({                              \
-    void* _value = *(a);        \
-    SDL_CompilerBarrier();      \
-    _value;                     \
-})
-#endif
-
-/**
  * \brief Set a pointer to a new value if it is currently an old value.
  *
  * \return SDL_TRUE if the pointer was set, SDL_FALSE otherwise.
@@ -297,6 +269,35 @@
 #endif
 extern DECLSPEC SDL_bool SDLCALL SDL_AtomicCASPtr_(void **a, void *oldval, void *newval);
 
+/**
+ * \brief Set a pointer to a value atomically.
+ *
+ * \return The previous value of the pointer.
+ */
+#ifndef SDL_AtomicSetPtr
+static __inline__ void* SDL_AtomicSetPtr(void* *a, void* v)
+{
+    void* value;
+    do {
+        value = *a;
+    } while (!SDL_AtomicCASPtr(a, value, v));
+    return value;
+}
+#endif
+
+/**
+ * \brief Get the value of a pointer atomically.
+ */
+#ifndef SDL_AtomicGetPtr
+static __inline__ void* SDL_AtomicGetPtr(void* *a)
+{
+    void* value = *a;
+    SDL_CompilerBarrier();
+    return value;
+}
+#endif
+
+
 /* Ends C function definitions when using C++ */
 #ifdef __cplusplus
 /* *INDENT-OFF* */
--- a/src/atomic/SDL_spinlock.c	Tue Jan 25 17:44:17 2011 -0800
+++ b/src/atomic/SDL_spinlock.c	Tue Jan 25 18:02:41 2011 -0800
@@ -37,20 +37,20 @@
     SDL_COMPILE_TIME_ASSERT(locksize, sizeof(*lock) == sizeof(long));
     return (InterlockedExchange((long*)lock, 1) == 0);
 
-#elif __MACOSX__
+#elif defined(__MACOSX__)
     return OSAtomicCompareAndSwap32Barrier(0, 1, lock);
 
 #elif HAVE_GCC_ATOMICS || HAVE_GCC_SYNC_LOCK_TEST_AND_SET
     return (__sync_lock_test_and_set(lock, 1) == 0);
 
-#elif __GNUC__ && __arm__ && __ARM_ARCH_5__
+#elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH_5__)
     int result;
     __asm__ __volatile__ (
         "swp %0, %1, [%2]\n"
         : "=&r,&r" (result) : "r,0" (1), "r,r" (lock) : "memory");
     return (result == 0);
 
-#elif __GNUC__ && __arm__
+#elif defined(__GNUC__) && defined(__arm__)
     int result;
     __asm__ __volatile__ (
         "ldrex %0, [%2]\nteq   %0, #0\nstrexeq %0, %1, [%2]"