From 223b85d345d4c0ca19f1c1e6e280c83b8543c167 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Lalinsk=C3=BD?= Date: Sat, 12 Mar 2011 23:19:01 +0100 Subject: [PATCH] Use GCC automic builtins where possible --- taglib/toolkit/taglib.h | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/taglib/toolkit/taglib.h b/taglib/toolkit/taglib.h index a43cdb6d..da7053ad 100644 --- a/taglib/toolkit/taglib.h +++ b/taglib/toolkit/taglib.h @@ -45,9 +45,19 @@ #include #ifdef __APPLE__ -#include -#elif defined(_MSC_VER) -#include +# include +# define TAGLIB_ATOMIC_MAC +#elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# include +# define TAGLIB_ATOMIC_WIN +#elif defined (__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 401) \ + && (defined(__i386__) || defined(__i486__) || defined(__i586__) || \ + defined(__i686__) || defined(__x86_64) || defined(__ia64)) \ + && !defined(__INTEL_COMPILER) +# define TAGLIB_ATOMIC_GCC +#elif defined(__ia64) && defined(__INTEL_COMPILER) +# include +# define TAGLIB_ATOMIC_GCC #endif //! A namespace for all TagLib related classes and functions @@ -88,21 +98,27 @@ namespace TagLib { public: RefCounter() : refCount(1) {} -#ifdef __APPLE__ +#ifdef TAGLIB_ATOMIC_MAC void ref() { OSAtomicIncrement32(&refCount); } bool deref() { return ! OSAtomicDecrement32(&refCount); } int32_t count() { return refCount; } private: volatile int32_t refCount; -#elif defined(_MSC_VER) +#elif defined(TAGLIB_ATOMIC_WIN) void ref() { InterlockedIncrement(&refCount); } bool deref() { return ! InterlockedDecrement(&refCount); } long count() { return refCount; } private: volatile long refCount; +#elif defined(TAGLIB_ATOMIC_GCC) + void ref() { __sync_add_and_fetch(&refCount, 1); } + bool deref() { return ! __sync_sub_and_fetch(&refCount, 1); } + int count() { return refCount; } + private: + volatile int refCount; #else void ref() { refCount++; } - bool deref() { return ! --refCount ; } + bool deref() { return ! --refCount; } int count() { return refCount; } private: uint refCount;