From 5b035911335bb7ecc668b3ae33b8a6c3a8ee8056 Mon Sep 17 00:00:00 2001 From: Mu-Woong Lee Date: Wed, 5 Apr 2017 11:19:40 +0900 Subject: [PATCH] Add handlers for uncaught exceptions and new failures Change-Id: I864ba0ddb05aaa8c1b21527a80a9f05cbf27861a Signed-off-by: Mu-Woong Lee --- packaging/contextd.service | 1 - src/server/ServerMain.cpp | 53 ++++++++++++++++++++++++++++++-------- src/server/ServiceLoader.h | 4 +-- 3 files changed, 44 insertions(+), 14 deletions(-) diff --git a/packaging/contextd.service b/packaging/contextd.service index cae5d7f..2e2a9cd 100644 --- a/packaging/contextd.service +++ b/packaging/contextd.service @@ -9,7 +9,6 @@ Type=dbus BusName=org.tizen.context ExecStart=/usr/bin/contextd Restart=on-failure -RestartSec=1 [Install] WantedBy=multi-user.target diff --git a/src/server/ServerMain.cpp b/src/server/ServerMain.cpp index 530d65c..25134e9 100644 --- a/src/server/ServerMain.cpp +++ b/src/server/ServerMain.cpp @@ -14,14 +14,22 @@ * limitations under the License. */ +#include #include #include +#include +#include +#include +#include + #include #include "DBusConnector.h" #include "ServiceLoader.h" #include "ActiveUserMonitor.h" #include "AlarmInitializer.h" +#define NEW_FAIL_LIMIT 3 + using namespace ctx; namespace { @@ -40,7 +48,7 @@ GMainLoop* MainLoop::__mainLoop = NULL; bool MainLoop::start() { __mainLoop = g_main_loop_new(NULL, FALSE); - IF_FAIL_RETURN_TAG(__mainLoop, false, _E, "Memory allocation failed"); + IF_FAIL_RETURN_TAG(__mainLoop, false, _E, E_STR_ALLOC); _I(CYAN("Starting...")); g_main_loop_run(__mainLoop); @@ -106,7 +114,7 @@ static void __busLost(GDBusConnection* conn) __stopService(NULL); } -static void __signalHandler(int signum) +static void __onSignal(int signum) { _I(YELLOW("SIGNAL-%d: '%s'"), signum, strsignal(signum)); static bool terminated = false; @@ -116,17 +124,40 @@ static void __signalHandler(int signum) } } +static void __onTerminate() +{ + try { + auto unknown = std::current_exception(); + if (unknown) { + std::rethrow_exception(unknown); + } + } catch (const std::exception& e) { + _E(RED("Unexpected exception: %s"), e.what()); + } catch (...) { + _E(RED("Unknown exception")); + } +} + +static void __onNewFailed() +{ + static unsigned failCount = 0; + _E_ALLOC; + failCount += 1; + if (failCount >= NEW_FAIL_LIMIT) + throw std::bad_alloc(); + usleep(100000); +} + int main(int argc, char* argv[]) { - static struct sigaction signalAction; - signalAction.sa_handler = __signalHandler; - sigemptyset(&signalAction.sa_mask); - - sigaction(SIGINT, &signalAction, NULL); - sigaction(SIGHUP, &signalAction, NULL); - sigaction(SIGTERM, &signalAction, NULL); - sigaction(SIGQUIT, &signalAction, NULL); - sigaction(SIGABRT, &signalAction, NULL); + std::signal(SIGINT, __onSignal); + std::signal(SIGHUP, __onSignal); + std::signal(SIGTERM, __onSignal); + std::signal(SIGQUIT, __onSignal); + std::signal(SIGABRT, __onSignal); + + std::set_terminate(__onTerminate); + std::set_new_handler(__onNewFailed); DBusConnector dbusConnector(__busAcquired, __busLost); diff --git a/src/server/ServiceLoader.h b/src/server/ServiceLoader.h index 5bedbb2..7492f14 100644 --- a/src/server/ServiceLoader.h +++ b/src/server/ServiceLoader.h @@ -45,8 +45,8 @@ namespace ctx { ServiceBase *svc = NULL; try { svc = new ServiceType(conn); - } catch (std::exception& e) { - _W("Service creation failed (%s)", e.what()); + } catch (const std::runtime_error& e) { + _I(YELLOW("%s"), e.what()); return; } if (svc->isUserService()) { -- 2.34.1