/*
- * Copyright (C) 2005-2012 Team XBMC
- * http://www.xbmc.org
+ * Copyright (C) 2005-2013 Team XBMC
+ * http://xbmc.org
*
* This Program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
*/
#include "Atomics.h"
+#include "system.h"
+
+// oskwon :: cas/cas2, not implemented yet.
-// the only safe way to be absolutly sure that
-// gcc intrinsics are present when using an unknown GCC
-#if defined(__GNUC__) && defined(__GNUC_MINOR__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
- #define HAS_GCC_INTRINSICS
-#elif defined(TARGET_DARWIN)
- // safe under darwin gcc-4.2, llvm-gcc-4.2 and clang
- #define HAS_GCC_INTRINSICS
-#elif defined(TARGET_FREEBSD)
- // safe under freebsd gcc-4.2 and clang
- #define HAS_GCC_INTRINSICS
-#endif
///////////////////////////////////////////////////////////////////////////
// 32-bit atomic compare-and-swap
// Returns previous value of *pAddr
///////////////////////////////////////////////////////////////////////////
long cas(volatile long *pAddr, long expectedVal, long swapVal)
{
-#if defined(HAS_GCC_INTRINSICS)
+#if defined(HAS_BUILTIN_SYNC_VAL_COMPARE_AND_SWAP)
return(__sync_val_compare_and_swap(pAddr, expectedVal, swapVal));
#elif defined(__ppc__) || defined(__powerpc__) // PowerPC
unsigned int prev;
#error atomic cas undefined for mips
return prev;
-#elif defined(WIN32)
+#elif defined(TARGET_WINDOWS)
long prev;
__asm
{
// Hack to allow compilation
throw "cas2 is not implemented";
-#elif defined(WIN32)
+#elif defined(TARGET_WINDOWS)
long long prev;
__asm
{
///////////////////////////////////////////////////////////////////////////
long AtomicIncrement(volatile long* pAddr)
{
-#if defined(HAS_GCC_INTRINSICS)
+#if defined(HAS_BUILTIN_SYNC_ADD_AND_FETCH)
return __sync_add_and_fetch(pAddr, 1);
#elif defined(__ppc__) || defined(__powerpc__) // PowerPC
#error AtomicIncrement undefined for mips
return val;
-#elif defined(WIN32)
+#elif defined(TARGET_WINDOWS)
long val;
__asm
{
///////////////////////////////////////////////////////////////////////////
long AtomicAdd(volatile long* pAddr, long amount)
{
-#if defined(HAS_GCC_INTRINSICS)
+#if defined(HAS_BUILTIN_SYNC_ADD_AND_FETCH)
return __sync_add_and_fetch(pAddr, amount);
#elif defined(__ppc__) || defined(__powerpc__) // PowerPC
#error AtomicAdd undefined for mips
return val;
-#elif defined(WIN32)
+#elif defined(TARGET_WINDOWS)
__asm
{
mov eax, amount;
///////////////////////////////////////////////////////////////////////////
long AtomicDecrement(volatile long* pAddr)
{
-#if defined(HAS_GCC_INTRINSICS)
+#if defined(HAS_BUILTIN_SYNC_SUB_AND_FETCH)
return __sync_sub_and_fetch(pAddr, 1);
#elif defined(__ppc__) || defined(__powerpc__) // PowerPC
#error AtomicDecrement undefined for mips
return val;
-#elif defined(WIN32)
+#elif defined(TARGET_WINDOWS)
long val;
__asm
{
///////////////////////////////////////////////////////////////////////////
long AtomicSubtract(volatile long* pAddr, long amount)
{
-#if defined(HAS_GCC_INTRINSICS)
+#if defined(HAS_BUILTIN_SYNC_SUB_AND_FETCH)
return __sync_sub_and_fetch(pAddr, amount);
#elif defined(__ppc__) || defined(__powerpc__) // PowerPC
#error AtomicSubtract undefined for mips
return val;
-#elif defined(WIN32)
+#elif defined(TARGET_WINDOWS)
amount *= -1;
__asm
{