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