summaryrefslogtreecommitdiff
path: root/cpp/src/IceUtil/GCShared.cpp
diff options
context:
space:
mode:
authorMarc Laukien <marc@zeroc.com>2003-10-27 17:21:57 +0000
committerMarc Laukien <marc@zeroc.com>2003-10-27 17:21:57 +0000
commitabc78fa6b630e109b521f2e8d9dadcbc5059f61c (patch)
tree1e61b9e5c625d5e18a6850abe1fab60aa50416bc /cpp/src/IceUtil/GCShared.cpp
parentfix (diff)
downloadice-abc78fa6b630e109b521f2e8d9dadcbc5059f61c.tar.bz2
ice-abc78fa6b630e109b521f2e8d9dadcbc5059f61c.tar.xz
ice-abc78fa6b630e109b521f2e8d9dadcbc5059f61c.zip
more gc cleanup
Diffstat (limited to 'cpp/src/IceUtil/GCShared.cpp')
-rw-r--r--cpp/src/IceUtil/GCShared.cpp95
1 files changed, 95 insertions, 0 deletions
diff --git a/cpp/src/IceUtil/GCShared.cpp b/cpp/src/IceUtil/GCShared.cpp
index 3454cfbe800..1d50d864d70 100644
--- a/cpp/src/IceUtil/GCShared.cpp
+++ b/cpp/src/IceUtil/GCShared.cpp
@@ -12,6 +12,101 @@
//
// **********************************************************************
+#include <IceUtil/GCRecMutex.h>
#include <IceUtil/GCShared.h>
+using namespace IceUtil;
+
IceUtil::GCObjectSet IceUtil::gcObjects;
+
+IceUtil::GCShared::GCShared()
+{
+ gcRecMutex._m->lock();
+ _ref = 0;
+ _noDelete = false;
+ _adopted = false;
+ gcRecMutex._m->unlock();
+}
+
+IceUtil::GCShared::~GCShared()
+{
+ gcRecMutex._m->lock();
+#ifdef NDEBUG // To avoid annoying warnings about variables that are not used...
+ gcObjects.erase(this);
+#else
+ GCObjectSet::size_type num = gcObjects.erase(this);
+ assert(num == 1 || !_adopted);
+#endif
+ gcRecMutex._m->unlock();
+}
+
+void
+IceUtil::GCShared::__incRef()
+{
+ gcRecMutex._m->lock();
+ assert(_ref >= 0);
+ if(!_adopted && _ref == 0)
+ {
+ _adopted = true;
+#ifdef NDEBUG // To avoid annoying warnings about variables that are not used...
+ gcObjects.insert(this);
+#else
+ std::pair<GCObjectSet::iterator, bool> rc = gcObjects.insert(this);
+ assert(rc.second);
+#endif
+ }
+ ++_ref;
+ gcRecMutex._m->unlock();
+}
+
+void
+IceUtil::GCShared::__decRef()
+{
+ gcRecMutex._m->lock();
+ bool doDelete = false;
+ assert(_ref > 0);
+ if(--_ref == 0)
+ {
+ doDelete = !_noDelete;
+ _noDelete = true;
+ }
+ if(doDelete)
+ {
+ delete this;
+ }
+ gcRecMutex._m->unlock();
+}
+
+int
+IceUtil::GCShared::__getRef() const
+{
+ gcRecMutex._m->lock();
+ int ref = _ref;
+ gcRecMutex._m->unlock();
+ return ref;
+}
+
+void
+IceUtil::GCShared::__setNoDelete(bool b)
+{
+ gcRecMutex._m->lock();
+ _noDelete = b;
+ gcRecMutex._m->unlock();
+}
+
+void
+IceUtil::GCShared::__decRefUnsafe()
+{
+ --_ref;
+}
+
+void
+IceUtil::GCShared::__addObject(GCObjectMultiSet& c, GCShared* p)
+{
+ gcRecMutex._m->lock();
+ if(p)
+ {
+ c.insert(p);
+ }
+ gcRecMutex._m->unlock();
+}