From 13fb4abba3fd3cac0d5cb25d3eccddc298220d41 Mon Sep 17 00:00:00 2001 From: Michael Krelin Date: Tue, 12 Feb 2013 20:37:10 +0000 Subject: introduce throwable_exit for nicer stack unwinding yes, I enjoy abusing features Signed-off-by: Michael Krelin --- diff --git a/src/eyefiworker.cc b/src/eyefiworker.cc index ac75fc1..1979b46 100644 --- a/src/eyefiworker.cc +++ b/src/eyefiworker.cc @@ -31,6 +31,8 @@ eyefiworker::eyefiworker() #endif ; } +eyefiworker::~eyefiworker() { +} int eyefiworker::run(int bindport) { #ifdef HAVE_SQLITE @@ -56,7 +58,7 @@ int eyefiworker::run(int bindport) { syslog(LOG_INFO,"maxrss: %ld\n",ru.ru_maxrss); } #endif /* NDEBUG */ - _exit(0); + throw throwable_exit(0); } close(socket); socket = SOAP_INVALID_SOCKET; } diff --git a/src/eyefiworker.h b/src/eyefiworker.h index 6d4082c..6cdecff 100644 --- a/src/eyefiworker.h +++ b/src/eyefiworker.h @@ -7,6 +7,7 @@ class eyefiworker : public eyefiService { public: eyefiworker(); + ~eyefiworker(); int run(int port) __attribute__ ((noreturn)); diff --git a/src/eyetil.h b/src/eyetil.h index eff2c43..03b9ba8 100644 --- a/src/eyetil.h +++ b/src/eyetil.h @@ -7,6 +7,11 @@ #include #include "openssl/md5.h" +struct throwable_exit { + int rc; + throwable_exit(int rc_) : rc(rc_) { } +}; + class binary_t : public std::vector { public: binary_t() { } diff --git a/src/iiid.cc b/src/iiid.cc index d655fe3..b3dd3bf 100644 --- a/src/iiid.cc +++ b/src/iiid.cc @@ -89,7 +89,9 @@ int main(int argc,char **argv) try { closelog(); return 0; -} catch(std::exception& e) { +} catch(const throwable_exit& e) { + return e.rc; +} catch(const std::exception& e) { syslog(LOG_CRIT,"Exiting iii daemon, because of error condition"); syslog(LOG_CRIT,"Exception: %s",e.what()); return 1; -- cgit v0.9.0.2