* limitations under the License.
*/
+#include <csignal>
#include <cstdlib>
#include <cstring>
+#include <unistd.h>
+#include <new>
+#include <exception>
+#include <stdexcept>
+
#include <ContextTypes.h>
#include "DBusConnector.h"
#include "ServiceLoader.h"
#include "ActiveUserMonitor.h"
#include "AlarmInitializer.h"
+#define NEW_FAIL_LIMIT 3
+
using namespace ctx;
namespace {
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);
__stopService(NULL);
}
-static void __signalHandler(int signum)
+static void __onSignal(int signum)
{
_I(YELLOW("SIGNAL-%d: '%s'"), signum, strsignal(signum));
static bool terminated = false;
}
}
+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);