From 40af8667d9c91d4e03bafa1ea3db7fe2ebae7677 Mon Sep 17 00:00:00 2001 From: Ramin Yaghoubzadeh <ryaghoub@techfak.uni-bielefeld.de> Date: Fri, 24 May 2013 16:32:54 +0200 Subject: [PATCH] Added an ipaaca::Abort exception to throw instead of exit() --- ipaacalib/cpp/include/ipaaca/ipaaca.h | 11 +++++++++++ ipaacalib/cpp/include/ipaaca/util/notifier.h | 3 ++- ipaacalib/cpp/src/util/notifier.cc | 14 ++++++++++++-- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca.h b/ipaacalib/cpp/include/ipaaca/ipaaca.h index eaf13de..ce554a9 100644 --- a/ipaacalib/cpp/include/ipaaca/ipaaca.h +++ b/ipaacalib/cpp/include/ipaaca/ipaaca.h @@ -156,6 +156,17 @@ class Exception: public std::exception//{{{ return _description.c_str(); } };//}}} +class Abort: public std::exception//{{{ +{ + protected: + std::string _description; + public: + inline Abort(const std::string& description=""): _description(description) { } + inline ~Abort() throw() { } + const char* what() const throw() { + return _description.c_str(); + } +};//}}} /// a reentrant lock/mutex class Lock diff --git a/ipaacalib/cpp/include/ipaaca/util/notifier.h b/ipaacalib/cpp/include/ipaaca/util/notifier.h index 4c012c8..a4d24d2 100644 --- a/ipaacalib/cpp/include/ipaaca/util/notifier.h +++ b/ipaacalib/cpp/include/ipaaca/util/notifier.h @@ -33,11 +33,12 @@ class ComponentNotifier { public: void add_notification_handler(ipaaca::IUEventHandlerFunction function); void initialize(); + void go_down(); protected: ipaaca::OutputBuffer::ptr out_buf; ipaaca::InputBuffer::ptr in_buf; ipaaca::Lock lock; - bool initialized; + bool initialized, gone_down; std::vector<ipaaca::IUEventHandlerFunction> _handlers; protected: std::string name; diff --git a/ipaacalib/cpp/src/util/notifier.cc b/ipaacalib/cpp/src/util/notifier.cc index 7dd9ede..a2b9658 100644 --- a/ipaacalib/cpp/src/util/notifier.cc +++ b/ipaacalib/cpp/src/util/notifier.cc @@ -5,13 +5,15 @@ namespace util { ComponentNotifier::~ComponentNotifier() { + LOG_IPAACA_CONSOLE("~ComponentNotifier") if (initialized) { - submit_notify(_IPAACA_COMP_NOTIF_STATE_DOWN); + LOG_IPAACA_CONSOLE(" - notifying") + go_down(); } } ComponentNotifier::ComponentNotifier(const std::string& componentName, const std::string& componentFunction, const std::set<std::string>& sendCategories, const std::set<std::string>& recvCategories) -: initialized(false), name(componentName), function(componentFunction) +: initialized(false), gone_down(false), name(componentName), function(componentFunction) { send_categories = ipaaca::str_join(sendCategories, ","); recv_categories = ipaaca::str_join(recvCategories, ","); @@ -85,5 +87,13 @@ void ComponentNotifier::initialize() { } } +void ComponentNotifier::go_down() { + Locker locker(lock); + if (initialized && (!gone_down)) { + gone_down = true; + submit_notify(_IPAACA_COMP_NOTIF_STATE_DOWN); + } +} + }} -- GitLab