summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/GC.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/Ice/GC.cpp')
-rw-r--r--cpp/src/Ice/GC.cpp40
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;