From 87c2b141d0fe879562c8732ca209212306ab8a7d Mon Sep 17 00:00:00 2001 From: Matthew Newhook Date: Tue, 8 Dec 2009 19:54:47 -0330 Subject: http://bugzilla/bugzilla/show_bug.cgi?id=4203 - Use gcc native atomic functions --- cpp/src/IceUtil/Shared.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'cpp/src/IceUtil/Shared.cpp') diff --git a/cpp/src/IceUtil/Shared.cpp b/cpp/src/IceUtil/Shared.cpp index 2c0205a4265..c25e8e74ee6 100644 --- a/cpp/src/IceUtil/Shared.cpp +++ b/cpp/src/IceUtil/Shared.cpp @@ -114,6 +114,9 @@ IceUtil::Shared::__incRef() #if defined(_WIN32) assert(InterlockedExchangeAdd(&_ref, 0) >= 0); InterlockedIncrement(&_ref); +#elif defined(ICE_HAS_GCC_BUILTINS) + int c = __sync_fetch_and_add(&_ref, 1); + assert(c >= 0); #elif defined(ICE_HAS_ATOMIC_FUNCTIONS) assert(IceUtilInternal::atomicExchangeAdd(&_ref, 0) >= 0); IceUtilInternal::atomicInc(&_ref); @@ -135,6 +138,14 @@ IceUtil::Shared::__decRef() _noDelete = true; delete this; } +#elif defined(ICE_HAS_GCC_BUILTINS) + int c = __sync_fetch_and_sub(&_ref, 1); + assert(c > 0); + if(c == 1 && !_noDelete) + { + _noDelete = true; + delete this; + } #elif defined(ICE_HAS_ATOMIC_FUNCTIONS) assert(IceUtilInternal::atomicExchangeAdd(&_ref, 0) > 0); if(IceUtilInternal::atomicDecAndTest(&_ref) && !_noDelete) @@ -164,6 +175,8 @@ IceUtil::Shared::__getRef() const { #if defined(_WIN32) return InterlockedExchangeAdd(const_cast(&_ref), 0); +#elif defined(ICE_HAS_GCC_BUILTINS) + return __sync_fetch_and_sub(const_cast(&_ref), 0); #elif defined(ICE_HAS_ATOMIC_FUNCTIONS) return IceUtilInternal::atomicExchangeAdd(const_cast(&_ref), 0); #else -- cgit v1.2.3