diff options
Diffstat (limited to 'cpp/src/IceGrid/ReapThread.h')
-rw-r--r-- | cpp/src/IceGrid/ReapThread.h | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/cpp/src/IceGrid/ReapThread.h b/cpp/src/IceGrid/ReapThread.h index e39812e0128..164ffe40fc8 100644 --- a/cpp/src/IceGrid/ReapThread.h +++ b/cpp/src/IceGrid/ReapThread.h @@ -13,6 +13,11 @@ #include <IceUtil/Thread.h> #include <IceUtil/Mutex.h> #include <IceUtil/Monitor.h> + +#include <Ice/Logger.h> +#include <Ice/LocalException.h> +#include <Ice/LoggerUtil.h> + #include <list> namespace IceGrid @@ -30,6 +35,58 @@ public: }; typedef IceUtil::Handle<Reapable> ReapablePtr; +template<class T> +class SessionReapable : public Reapable +{ + typedef IceUtil::Handle<T> TPtr; + +public: + + SessionReapable(const Ice::LoggerPtr& logger, const TPtr& session) : + _logger(logger), _session(session) + { + } + + virtual ~SessionReapable() + { + } + + virtual IceUtil::Time + timestamp() const + { + return _session->timestamp(); + } + + virtual void + destroy(bool shutdown) + { + try + { + if(shutdown) + { + _session->shutdown(); + } + else + { + _session->destroy(Ice::Current()); + } + } + catch(const Ice::ObjectNotExistException&) + { + } + catch(const Ice::LocalException& ex) + { + Ice::Warning out(_logger); + out << "unexpected exception while reaping session:\n" << ex; + } + } + +private: + + const Ice::LoggerPtr _logger; + const TPtr _session; +}; + class ReapThread : public IceUtil::Thread, public IceUtil::Monitor<IceUtil::Mutex> { public: |