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