diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca.h b/ipaacalib/cpp/include/ipaaca/ipaaca.h index eaf13de74b010f1b1974058ed01bff476ac39eec..ce554a9041c6b18c15f93925a67d16f988496e82 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 4c012c8783ebef451aba477ac7174a8c26b71ca6..a4d24d278209cbd3d06906b2924b0f22c7b397ab 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 7dd9ede94dd4946e1274e483f536fc1839f3ad64..a2b96583dafa4a195572ef588a7e1042330cffd5 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); + } +} + }}