diff options
author | Benoit Foucher <benoit@zeroc.com> | 2014-05-23 11:59:44 +0200 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2014-05-23 11:59:44 +0200 |
commit | d81701ca8182942b7936f9fd84a019b695e9c890 (patch) | |
tree | dc036c9d701fbbe1afad67782bd78572c0f61974 /cpp/src/Ice/ACM.h | |
parent | Fixed bug ICE-5543: stringToIdentity bug with escaped escapes (diff) | |
download | ice-d81701ca8182942b7936f9fd84a019b695e9c890.tar.bz2 ice-d81701ca8182942b7936f9fd84a019b695e9c890.tar.xz ice-d81701ca8182942b7936f9fd84a019b695e9c890.zip |
Added support for invocation timeouts and ACM heartbeats
Diffstat (limited to 'cpp/src/Ice/ACM.h')
-rw-r--r-- | cpp/src/Ice/ACM.h | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/cpp/src/Ice/ACM.h b/cpp/src/Ice/ACM.h new file mode 100644 index 00000000000..efb28ed8d34 --- /dev/null +++ b/cpp/src/Ice/ACM.h @@ -0,0 +1,117 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved. +// +// This copy of Ice is licensed to you under the terms described in the +// ICE_LICENSE file included in this distribution. +// +// ********************************************************************** + +#ifndef ICE_ACM_H +#define ICE_ACM_H + +#include <IceUtil/Mutex.h> +#include <IceUtil/Monitor.h> +#include <IceUtil/Timer.h> +#include <Ice/ACMF.h> +#include <Ice/Connection.h> +#include <Ice/ConnectionIF.h> +#include <Ice/InstanceF.h> +#include <Ice/PropertiesF.h> +#include <Ice/LoggerF.h> +#include <set> + +namespace IceInternal +{ + +class ACMConfig +{ +public: + + ACMConfig(bool = false); + ACMConfig(const Ice::PropertiesPtr&, const Ice::LoggerPtr&, const std::string&, const ACMConfig&); + + IceUtil::Time timeout; + Ice::ACMHeartbeat heartbeat; + Ice::ACMClose close; +}; + +class ACMMonitor : public IceUtil::TimerTask +{ +public: + + virtual void add(const Ice::ConnectionIPtr&) = 0; + virtual void remove(const Ice::ConnectionIPtr&) = 0; + virtual void reap(const Ice::ConnectionIPtr&) = 0; + + virtual ACMMonitorPtr acm(const IceUtil::Optional<int>&, + const IceUtil::Optional<Ice::ACMClose>&, + const IceUtil::Optional<Ice::ACMHeartbeat>&) = 0; + virtual Ice::ACM getACM() = 0; +}; + +class FactoryACMMonitor : public ACMMonitor, public ::IceUtil::Mutex +{ +public: + + FactoryACMMonitor(const InstancePtr&, const ACMConfig&); + virtual ~FactoryACMMonitor(); + + virtual void add(const Ice::ConnectionIPtr&); + virtual void remove(const Ice::ConnectionIPtr&); + virtual void reap(const Ice::ConnectionIPtr&); + + virtual ACMMonitorPtr acm(const IceUtil::Optional<int>&, + const IceUtil::Optional<Ice::ACMClose>&, + const IceUtil::Optional<Ice::ACMHeartbeat>&); + virtual Ice::ACM getACM(); + + void destroy(); + void swapReapedConnections(std::vector<Ice::ConnectionIPtr>&); + +private: + + friend class ConnectionACMMonitor; + void handleException(const std::exception&); + void handleException(); + + virtual void runTimerTask(); + + InstancePtr _instance; + const ACMConfig _config; + + std::vector<std::pair<Ice::ConnectionIPtr, bool> > _changes; + std::set<Ice::ConnectionIPtr> _connections; + std::vector<Ice::ConnectionIPtr> _reapedConnections; +}; + +class ConnectionACMMonitor : public ACMMonitor, public ::IceUtil::Mutex +{ +public: + + ConnectionACMMonitor(const FactoryACMMonitorPtr&, const IceUtil::TimerPtr&, const ACMConfig&); + virtual ~ConnectionACMMonitor(); + + virtual void add(const Ice::ConnectionIPtr&); + virtual void remove(const Ice::ConnectionIPtr&); + virtual void reap(const Ice::ConnectionIPtr&); + + virtual ACMMonitorPtr acm(const IceUtil::Optional<int>&, + const IceUtil::Optional<Ice::ACMClose>&, + const IceUtil::Optional<Ice::ACMHeartbeat>&); + virtual Ice::ACM getACM(); + +private: + + virtual void runTimerTask(); + + const FactoryACMMonitorPtr _parent; + const IceUtil::TimerPtr _timer; + const ACMConfig _config; + + Ice::ConnectionIPtr _connection; +}; + +} + +#endif |