diff options
Diffstat (limited to 'cpp/src/Ice/MetricsObserverI.h')
-rw-r--r-- | cpp/src/Ice/MetricsObserverI.h | 53 |
1 files changed, 42 insertions, 11 deletions
diff --git a/cpp/src/Ice/MetricsObserverI.h b/cpp/src/Ice/MetricsObserverI.h index 7af71ae3e8d..2e216cca87b 100644 --- a/cpp/src/Ice/MetricsObserverI.h +++ b/cpp/src/Ice/MetricsObserverI.h @@ -12,7 +12,7 @@ #include <IceUtil/StopWatch.h> -#include <Ice/Observer.h> +#include <Ice/Instrumentation.h> #include <Ice/Metrics.h> #include <Ice/MetricsAdminI.h> @@ -340,6 +340,7 @@ public: } else // Removed metrics object { + (*q)->detach(_watch.delay()); q = _objects.erase(q); } } @@ -391,7 +392,7 @@ newUpdater(const IceInternal::Handle<T>& updater, void (T::*fn)()) } template<typename ObserverImplType> -class ObserverFactoryT : private IceUtil::Mutex +class ObserverFactoryT : public Updater, private IceUtil::Mutex { public: @@ -402,13 +403,21 @@ public: ObserverFactoryT(const MetricsAdminIPtr& metrics, const std::string& name) : _metrics(metrics), _name(name) { - _metrics->registerMap<MetricsType>(name); + _metrics->registerMap<MetricsType>(name, this); } ObserverFactoryT(const std::string& name) : _name(name) { } + ~ObserverFactoryT() + { + if(_metrics) + { + _metrics->unregisterMap(_name); + } + } + ObserverImplPtrType getObserver(const MetricsHelperT<MetricsType>& helper) { @@ -482,17 +491,38 @@ public: return _enabled; } - void updateMaps() + virtual void update() { - IceUtil::Mutex::Lock sync(*this); - std::vector<MetricsMapIPtr> maps = _metrics->getMaps(_name); - _maps.clear(); - for(std::vector<MetricsMapIPtr>::const_iterator p = maps.begin(); p != maps.end(); ++p) + UpdaterPtr updater; + { + IceUtil::Mutex::Lock sync(*this); + std::vector<MetricsMapIPtr> maps = _metrics->getMaps(_name); + _maps.clear(); + for(std::vector<MetricsMapIPtr>::const_iterator p = maps.begin(); p != maps.end(); ++p) + { + _maps.push_back(IceUtil::Handle<MetricsMapT<MetricsType> >::dynamicCast(*p)); + assert(_maps.back()); + } + _enabled = !_maps.empty(); + updater = _updater; + } + + if(updater) { - _maps.push_back(IceUtil::Handle<MetricsMapT<MetricsType> >::dynamicCast(*p)); - assert(_maps.back()); + try + { + updater->update(); + } + catch(const std::exception& ex) + { + } } - _enabled = !_maps.empty(); + } + + void setUpdater(const UpdaterPtr& updater) + { + IceUtil::Mutex::Lock sync(*this); + _updater = updater; } private: @@ -501,6 +531,7 @@ private: const std::string _name; MetricsMapSeqType _maps; volatile bool _enabled; + UpdaterPtr _updater; }; } |