diff options
Diffstat (limited to 'cpp/src/Ice/GC.cpp')
-rw-r--r-- | cpp/src/Ice/GC.cpp | 40 |
1 files changed, 28 insertions, 12 deletions
diff --git a/cpp/src/Ice/GC.cpp b/cpp/src/Ice/GC.cpp index 04d934cc008..29b6fcf452f 100644 --- a/cpp/src/Ice/GC.cpp +++ b/cpp/src/Ice/GC.cpp @@ -54,24 +54,17 @@ using namespace IceInternal; // GCShared // -IceInternal::GCShared::GCShared() : - _ref(0), - _noDelete(false) -{ -} - -IceInternal::GCShared::GCShared(const GCShared&) : - _ref(0), - _noDelete(false) -{ -} - void IceInternal::GCShared::__incRef() { RecMutex::Lock lock(gcRecMutex); +#if defined(ICE_HAS_ATOMIC_FUNCTIONS) + assert(_ref.counter >= 0); + atomicInc(&_ref); +#else assert(_ref >= 0); ++_ref; +#endif } void @@ -79,8 +72,13 @@ IceInternal::GCShared::__decRef() { RecMutex::Lock lock(gcRecMutex); bool doDelete = false; +#if defined(ICE_HAS_ATOMIC_FUNCTIONS) + assert(_ref.counter > 0); + if(IceUtilInternal::atomicDecAndTest(&_ref)) +#else assert(_ref > 0); if(--_ref == 0) +#endif { doDelete = !_noDelete; _noDelete = true; @@ -96,7 +94,11 @@ int IceInternal::GCShared::__getRef() const { RecMutex::Lock lock(gcRecMutex); +#if defined(ICE_HAS_ATOMIC_FUNCTIONS) + return _ref.counter; +#else return _ref; +#endif } void @@ -110,8 +112,13 @@ void IceInternal::GCShared::__gcIncRef() { RecMutex::Lock lock(gcRecMutex); +#if defined(ICE_HAS_ATOMIC_FUNCTIONS) + assert(_ref.counter >= 0); + if(_ref.counter == 0) +#else assert(_ref >= 0); if(_ref == 0) +#endif { #ifdef NDEBUG // To avoid annoying warnings about variables that are not used... gcObjects.insert(this); @@ -120,7 +127,11 @@ IceInternal::GCShared::__gcIncRef() assert(rc.second); #endif } +#if defined(ICE_HAS_ATOMIC_FUNCTIONS) + IceUtilInternal::atomicInc(&_ref); +#else ++_ref; +#endif } void @@ -128,8 +139,13 @@ IceInternal::GCShared::__gcDecRef() { RecMutex::Lock lock(gcRecMutex); bool doDelete = false; +#if defined(ICE_HAS_ATOMIC_FUNCTIONS) + assert(_ref.counter > 0); + if(IceUtilInternal::atomicDecAndTest(&_ref)) +#else assert(_ref > 0); if(--_ref == 0) +#endif { doDelete = !_noDelete; _noDelete = true; |