diff options
author | Marc Laukien <marc@zeroc.com> | 2003-10-27 17:21:57 +0000 |
---|---|---|
committer | Marc Laukien <marc@zeroc.com> | 2003-10-27 17:21:57 +0000 |
commit | abc78fa6b630e109b521f2e8d9dadcbc5059f61c (patch) | |
tree | 1e61b9e5c625d5e18a6850abe1fab60aa50416bc /cpp/src/IceUtil/GCShared.cpp | |
parent | fix (diff) | |
download | ice-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.cpp | 95 |
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(); +} |