diff --git a/taglib/toolkit/trefcounter.cpp b/taglib/toolkit/trefcounter.cpp index 2445c8ba..9ca581bc 100644 --- a/taglib/toolkit/trefcounter.cpp +++ b/taglib/toolkit/trefcounter.cpp @@ -25,37 +25,7 @@ #include "trefcounter.h" -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#if defined(HAVE_GCC_ATOMIC) -# define ATOMIC_INT int -# define ATOMIC_INC(x) __sync_add_and_fetch(&(x), 1) -# define ATOMIC_DEC(x) __sync_sub_and_fetch(&(x), 1) -#elif defined(HAVE_WIN_ATOMIC) -# if !defined(NOMINMAX) -# define NOMINMAX -# endif -# include -# define ATOMIC_INT long -# define ATOMIC_INC(x) InterlockedIncrement(&x) -# define ATOMIC_DEC(x) InterlockedDecrement(&x) -#elif defined(HAVE_MAC_ATOMIC) -# include -# define ATOMIC_INT int32_t -# define ATOMIC_INC(x) OSAtomicIncrement32Barrier(&x) -# define ATOMIC_DEC(x) OSAtomicDecrement32Barrier(&x) -#elif defined(HAVE_IA64_ATOMIC) -# include -# define ATOMIC_INT int -# define ATOMIC_INC(x) __sync_add_and_fetch(&x, 1) -# define ATOMIC_DEC(x) __sync_sub_and_fetch(&x, 1) -#else -# define ATOMIC_INT int -# define ATOMIC_INC(x) (++x) -# define ATOMIC_DEC(x) (--x) -#endif +#include namespace TagLib { @@ -64,9 +34,11 @@ namespace TagLib { public: RefCounterPrivate() : - refCount(1) {} + refCount(1) + { + } - volatile ATOMIC_INT refCount; + std::atomic_int refCount; }; RefCounter::RefCounter() : @@ -81,16 +53,16 @@ namespace TagLib void RefCounter::ref() { - ATOMIC_INC(d->refCount); + d->refCount.fetch_add(1); } bool RefCounter::deref() { - return (ATOMIC_DEC(d->refCount) == 0); + return d->refCount.fetch_sub(1) == 1; } int RefCounter::count() const { - return static_cast(d->refCount); + return d->refCount.load(); } } // namespace TagLib diff --git a/taglib/toolkit/trefcounter.h b/taglib/toolkit/trefcounter.h index 2d23a908..65da1ee8 100644 --- a/taglib/toolkit/trefcounter.h +++ b/taglib/toolkit/trefcounter.h @@ -29,26 +29,6 @@ #include "taglib_export.h" #include "taglib.h" -#ifdef __APPLE__ -# define OSATOMIC_DEPRECATED 0 -# include -# define TAGLIB_ATOMIC_MAC -#elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) -# ifndef NOMINMAX -# define NOMINMAX -# endif -# 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 - #ifndef DO_NOT_DOCUMENT // Tell Doxygen to skip this class. /*! * \internal