diff options
author | Benoit Foucher <benoit@zeroc.com> | 2014-08-01 15:46:23 +0200 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2014-08-01 15:46:23 +0200 |
commit | d63daa520a5fc99cf7acbae17767bc0776d6ba5b (patch) | |
tree | 558969644df7f03c96ebdcf2effc83a1145061bb /cpp/src/Ice/Instance.cpp | |
parent | Fixed GCObject code-style issues (diff) | |
download | ice-d63daa520a5fc99cf7acbae17767bc0776d6ba5b.tar.bz2 ice-d63daa520a5fc99cf7acbae17767bc0776d6ba5b.tar.xz ice-d63daa520a5fc99cf7acbae17767bc0776d6ba5b.zip |
Fixed leak when observer updater is installed, code-style issues
Diffstat (limited to 'cpp/src/Ice/Instance.cpp')
-rw-r--r-- | cpp/src/Ice/Instance.cpp | 47 |
1 files changed, 29 insertions, 18 deletions
diff --git a/cpp/src/Ice/Instance.cpp b/cpp/src/Ice/Instance.cpp index a83e1f3e3ba..6bea9242dd1 100644 --- a/cpp/src/Ice/Instance.cpp +++ b/cpp/src/Ice/Instance.cpp @@ -166,36 +166,43 @@ Init init; } -namespace IceInternal +namespace IceInternal // Required because ObserverUpdaterI is a friend of Instance { class ObserverUpdaterI : public Ice::Instrumentation::ObserverUpdater { public: - ObserverUpdaterI(InstancePtr instance) : _instance(instance) - { - } - - void updateConnectionObservers() - { - _instance->updateConnectionObservers(); - } + ObserverUpdaterI(const InstancePtr&); - void updateThreadObservers() - { - _instance->updateThreadObservers(); - } + virtual void updateConnectionObservers(); + virtual void updateThreadObservers(); private: - InstancePtr _instance; + const InstancePtr _instance; }; } IceUtil::Shared* IceInternal::upCast(Instance* p) { return p; } +IceInternal::ObserverUpdaterI::ObserverUpdaterI(const InstancePtr& instance) : _instance(instance) +{ +} + +void +IceInternal::ObserverUpdaterI::updateConnectionObservers() +{ + _instance->updateConnectionObservers(); +} + +void +IceInternal::ObserverUpdaterI::updateThreadObservers() +{ + _instance->updateThreadObservers(); +} + bool IceInternal::Instance::destroyed() const { @@ -1460,11 +1467,15 @@ IceInternal::Instance::destroy() _metricsAdmin->destroy(); _metricsAdmin = 0; - // Break cyclic reference counts. Don't clear _observer, it's immutable. - CommunicatorObserverIPtr observer = CommunicatorObserverIPtr::dynamicCast(_observer); - if(observer) + if(_observer) { - observer->destroy(); + // Break cyclic reference counts. Don't clear _observer, it's immutable. + CommunicatorObserverIPtr observer = CommunicatorObserverIPtr::dynamicCast(_observer); + if(observer) + { + observer->destroy(); + } + _observer->setObserverUpdater(0); // Break cyclic reference count. } } |