diff options
Diffstat (limited to 'cpp/src/IceUtil')
-rw-r--r-- | cpp/src/IceUtil/Shared.cpp | 61 |
1 files changed, 2 insertions, 59 deletions
diff --git a/cpp/src/IceUtil/Shared.cpp b/cpp/src/IceUtil/Shared.cpp index f242ee8d986..f88068569e0 100644 --- a/cpp/src/IceUtil/Shared.cpp +++ b/cpp/src/IceUtil/Shared.cpp @@ -44,81 +44,24 @@ IceUtil::Shared::Shared(const Shared&) : void IceUtil::Shared::__incRef() { -#if defined(ICE_CPP11) - assert(_ref.fetch_add(0, std::memory_order_relaxed) >= 0); - ++_ref; -#elif defined(_WIN32) - assert(InterlockedExchangeAdd(&_ref, 0) >= 0); - InterlockedIncrement(&_ref); -#elif defined(ICE_HAS_GCC_BUILTINS) - -# ifndef NDEBUG - int c = -# endif - __sync_fetch_and_add(&_ref, 1); - assert(c >= 0); -#else - _mutex.lock(); assert(_ref >= 0); ++_ref; - _mutex.unlock(); -#endif } void IceUtil::Shared::__decRef() { -#if defined(ICE_CPP11) - assert(_ref.fetch_add(0, std::memory_order_relaxed) > 0); - if(--_ref == 0 && !(_flags & NoDelete)) - { - delete this; - } -#elif defined(_WIN32) - assert(InterlockedExchangeAdd(&_ref, 0) > 0); - if(InterlockedDecrement(&_ref) == 0 && !(_flags & NoDelete)) - { - delete this; - } -#elif defined(ICE_HAS_GCC_BUILTINS) - int c = __sync_fetch_and_sub(&_ref, 1); - assert(c > 0); - if(c == 1 && !(_flags & NoDelete)) - { - delete this; - } -#else - bool doDelete = false; - _mutex.lock(); assert(_ref > 0); - if(--_ref == 0) - { - doDelete = !(_flags & NoDelete); - _flags |= NoDelete; - } - _mutex.unlock(); - if(doDelete) + if(--_ref == 0 && !(_flags & NoDelete)) { delete this; } -#endif } int IceUtil::Shared::__getRef() const { -#if defined(ICE_CPP11) - return _ref.load(std::memory_order_relaxed); -#elif defined(_WIN32) - return InterlockedExchangeAdd(const_cast<LONG*>(&_ref), 0); -#elif defined(ICE_HAS_GCC_BUILTINS) - return __sync_fetch_and_sub(const_cast<volatile int*>(&_ref), 0); -#else - _mutex.lock(); - int ref = _ref; - _mutex.unlock(); - return ref; -#endif + return _ref; } void |