Changed: Use of BSD function OSAtomicCompareAndSwap32 under Mac OS X

This commit is contained in:
kervala 2010-10-05 21:35:17 +02:00
parent 55f56a498a
commit 384c3cedbf

View file

@ -22,17 +22,19 @@
#include "common.h" #include "common.h"
#include <map> #include <map>
#ifdef NL_OS_UNIX #ifdef NL_OS_WINDOWS
//#include <iostream>
#include <pthread.h> // PThread
#include <semaphore.h> // PThread POSIX semaphores
#include <unistd.h>
#define __forceinline
#elif defined(NL_OS_WINDOWS)
# ifdef NL_NO_ASM # ifdef NL_NO_ASM
# include <intrin.h> # include <intrin.h>
# endif # endif
#endif #elif defined(NL_OS_UNIX)
# include <pthread.h> // PThread
# include <semaphore.h> // PThread POSIX semaphores
# include <unistd.h>
# define __forceinline
# ifdef NL_OS_MAC
# include <libkern/OSAtomic.h>
# endif
#endif // NL_OS_WINDOWS
#undef MUTEX_DEBUG #undef MUTEX_DEBUG
@ -245,12 +247,18 @@ public:
} }
# endif // NL_DEBUG # endif // NL_DEBUG
# endif // NL_NO_ASM # endif // NL_NO_ASM
#else #elif defined(NL_OS_MAC)
// GCC implements the same functionality using a builtin function return OSAtomicCompareAndSwap32(0, 1, reinterpret_cast<volatile sint32 *>(lockPtr));
// http://gcc.gnu.org/onlinedocs/gcc/Atomic-Builtins.html #elif defined(NL_OS_UNIX)
// the macro below crashed on Mac OS X 10.6 in a 64bit build // GCC implements the same functionality using a builtin function
//ASM_ASWAP_FOR_GCC_XCHG // http://gcc.gnu.org/onlinedocs/gcc/Atomic-Builtins.html
result = __sync_bool_compare_and_swap(lockPtr, 0, 1); // the macro below crashed on Mac OS X 10.6 in a 64bit build
# if (GCC_VERSION > 40100)
// return __sync_bool_compare_and_swap(lockPtr, 0, 1);
result = __sync_val_compare_and_swap(lockPtr, 0, 1);
# else
ASM_ASWAP_FOR_GCC_XCHG
# endif
#endif // NL_OS_WINDOWS #endif // NL_OS_WINDOWS
return result != 0; return result != 0;
} }