summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/InstrumentationI.h
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2013-09-09 19:12:28 +0200
committerBenoit Foucher <benoit@zeroc.com>2013-09-09 19:12:28 +0200
commit8a0d1c7e34d8bd18bd85666cce94403a5158975c (patch)
tree36050a818282c0a92ee88a6ef28354e186c5aebe /cpp/src/Ice/InstrumentationI.h
parentTest scripts improvements (diff)
downloadice-8a0d1c7e34d8bd18bd85666cce94403a5158975c.tar.bz2
ice-8a0d1c7e34d8bd18bd85666cce94403a5158975c.tar.xz
ice-8a0d1c7e34d8bd18bd85666cce94403a5158975c.zip
Fixed ICE-5196: allow setting an observer with IceMX enabled
Diffstat (limited to 'cpp/src/Ice/InstrumentationI.h')
-rw-r--r--cpp/src/Ice/InstrumentationI.h146
1 files changed, 128 insertions, 18 deletions
diff --git a/cpp/src/Ice/InstrumentationI.h b/cpp/src/Ice/InstrumentationI.h
index 9f6b61327b9..1db093feae2 100644
--- a/cpp/src/Ice/InstrumentationI.h
+++ b/cpp/src/Ice/InstrumentationI.h
@@ -16,6 +16,109 @@
namespace IceInternal
{
+template<typename T, typename O> class ObserverWithDelegateT : public IceMX::ObserverT<T>, virtual public O
+{
+public:
+
+ typedef O ObserverType;
+ typedef typename IceInternal::Handle<O> ObserverPtrType;
+
+ virtual void
+ attach()
+ {
+ IceMX::ObserverT<T>::attach();
+ if(_delegate)
+ {
+ _delegate->attach();
+ }
+ }
+
+ virtual void
+ detach()
+ {
+ IceMX::ObserverT<T>::detach();
+ if(_delegate)
+ {
+ _delegate->detach();
+ }
+ }
+
+ virtual void
+ failed(const std::string& exceptionName)
+ {
+ IceMX::ObserverT<T>::failed(exceptionName);
+ if(_delegate)
+ {
+ _delegate->failed(exceptionName);
+ }
+ }
+
+ ObserverPtrType
+ getDelegate() const
+ {
+ return _delegate;
+ }
+
+ void
+ setDelegate(ObserverPtrType delegate)
+ {
+ _delegate = delegate;
+ }
+
+ template<typename ObserverImpl, typename ObserverMetricsType, typename ObserverPtrType> ObserverPtrType
+ getObserver(const std::string& mapName, const IceMX::MetricsHelperT<ObserverMetricsType>& helper,
+ const ObserverPtrType& del)
+ {
+ IceInternal::Handle<ObserverImpl> obsv = IceMX::ObserverT<T>::template getObserver<ObserverImpl>(mapName,
+ helper);
+ if(obsv)
+ {
+ obsv->setDelegate(del);
+ return obsv;
+ }
+ return del;
+ }
+
+protected:
+
+ ObserverPtrType _delegate;
+};
+
+template<typename T> class ObserverFactoryWithDelegateT : public IceMX::ObserverFactoryT<T>
+{
+public:
+
+ ObserverFactoryWithDelegateT(const IceInternal::MetricsAdminIPtr& metrics, const std::string& name) :
+ IceMX::ObserverFactoryT<T>(metrics, name)
+ {
+ }
+
+ template<typename ObserverMetricsType, typename ObserverPtrType> ObserverPtrType
+ getObserver(const IceMX::MetricsHelperT<ObserverMetricsType>& helper, const ObserverPtrType& del)
+ {
+ IceInternal::Handle<T> obsv = IceMX::ObserverFactoryT<T>::getObserver(helper);
+ if(obsv)
+ {
+ obsv->setDelegate(del);
+ return obsv;
+ }
+ return del;
+ }
+
+ template<typename ObserverMetricsType, typename ObserverPtrType> ObserverPtrType
+ getObserver(const IceMX::MetricsHelperT<ObserverMetricsType>& helper, const ObserverPtrType& del,
+ const ObserverPtrType& old)
+ {
+ IceInternal::Handle<T> obsv = IceMX::ObserverFactoryT<T>::getObserver(helper, old);
+ if(obsv)
+ {
+ obsv->setDelegate(del);
+ return obsv;
+ }
+ return del;
+ }
+};
+
template<typename Helper>
void addEndpointAttributes(typename Helper::Attributes& attrs)
{
@@ -49,8 +152,8 @@ void addConnectionAttributes(typename Helper::Attributes& attrs)
addEndpointAttributes<Helper>(attrs);
}
-class ConnectionObserverI : public Ice::Instrumentation::ConnectionObserver,
- public IceMX::ObserverT<IceMX::ConnectionMetrics>
+class ConnectionObserverI : public ObserverWithDelegateT<IceMX::ConnectionMetrics,
+ Ice::Instrumentation::ConnectionObserver>
{
public:
@@ -58,16 +161,14 @@ public:
virtual void receivedBytes(Ice::Int);
};
-class ThreadObserverI : public Ice::Instrumentation::ThreadObserver,
- public IceMX::ObserverT<IceMX::ThreadMetrics>
+class ThreadObserverI : public ObserverWithDelegateT<IceMX::ThreadMetrics, Ice::Instrumentation::ThreadObserver>
{
public:
virtual void stateChanged(Ice::Instrumentation::ThreadState, Ice::Instrumentation::ThreadState);
};
-class DispatchObserverI : public Ice::Instrumentation::DispatchObserver,
- public IceMX::ObserverT<IceMX::DispatchMetrics>
+class DispatchObserverI : public ObserverWithDelegateT<IceMX::DispatchMetrics, Ice::Instrumentation::DispatchObserver>
{
public:
@@ -76,14 +177,15 @@ public:
virtual void reply(Ice::Int);
};
-class RemoteObserverI : public Ice::Instrumentation::RemoteObserver,
- public IceMX::ObserverT<IceMX::RemoteMetrics>
+class RemoteObserverI : public ObserverWithDelegateT<IceMX::RemoteMetrics, Ice::Instrumentation::RemoteObserver>
{
+public:
+
virtual void reply(Ice::Int);
};
-class InvocationObserverI : public Ice::Instrumentation::InvocationObserver,
- public IceMX::ObserverT<IceMX::InvocationMetrics>
+class InvocationObserverI : public ObserverWithDelegateT<IceMX::InvocationMetrics,
+ Ice::Instrumentation::InvocationObserver>
{
public:
@@ -95,11 +197,15 @@ public:
const Ice::EndpointPtr&, Ice::Int, Ice::Int);
};
+typedef ObserverWithDelegateT<IceMX::Metrics, Ice::Instrumentation::Observer> ObserverI;
+
class ICE_API CommunicatorObserverI : public Ice::Instrumentation::CommunicatorObserver
{
public:
- CommunicatorObserverI(const IceInternal::MetricsAdminIPtr&);
+ CommunicatorObserverI(const IceInternal::MetricsAdminIPtr&,
+ const Ice::Instrumentation::CommunicatorObserverPtr& =
+ Ice::Instrumentation::CommunicatorObserverPtr());
virtual void setObserverUpdater(const Ice::Instrumentation::ObserverUpdaterPtr&);
@@ -126,16 +232,20 @@ public:
const IceInternal::MetricsAdminIPtr& getMetricsAdmin() const;
+ void destroy();
+
private:
- const IceInternal::MetricsAdminIPtr _metrics;
+ IceInternal::MetricsAdminIPtr _metrics;
+ Ice::LoggerPtr _logger;
+ const Ice::Instrumentation::CommunicatorObserverPtr _delegate;
- IceMX::ObserverFactoryT<ConnectionObserverI> _connections;
- IceMX::ObserverFactoryT<DispatchObserverI> _dispatch;
- IceMX::ObserverFactoryT<InvocationObserverI> _invocations;
- IceMX::ObserverFactoryT<ThreadObserverI> _threads;
- IceMX::ObserverFactoryT<IceMX::ObserverI> _connects;
- IceMX::ObserverFactoryT<IceMX::ObserverI> _endpointLookups;
+ ObserverFactoryWithDelegateT<ConnectionObserverI> _connections;
+ ObserverFactoryWithDelegateT<DispatchObserverI> _dispatch;
+ ObserverFactoryWithDelegateT<InvocationObserverI> _invocations;
+ ObserverFactoryWithDelegateT<ThreadObserverI> _threads;
+ ObserverFactoryWithDelegateT<ObserverI> _connects;
+ ObserverFactoryWithDelegateT<ObserverI> _endpointLookups;
};
typedef IceUtil::Handle<CommunicatorObserverI> CommunicatorObserverIPtr;