X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?p=src%2Fapp-framework-binder.git;a=blobdiff_plain;f=src%2Fsig-monitor.c;h=b209dbf6ab2ef7d43857f4856e8de2871c0f8ecd;hp=705928120730935060df61b5cd9a61bff02afce9;hb=65353dce81a629e042800bb7b86fcd869a76727e;hpb=036629f2e6306f3e2bb520bc58565d9a9db28a45 diff --git a/src/sig-monitor.c b/src/sig-monitor.c index 70592812..b209dbf6 100644 --- a/src/sig-monitor.c +++ b/src/sig-monitor.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017-2019 "IoT.bzh" + * Copyright (C) 2015-2020 "IoT.bzh" * Author José Bollo * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -284,9 +284,9 @@ static void on_rescue_exit(int signum) } /* - * Do a safe exit + * Do a direct safe exit */ -static void safe_exit(int code) +static void direct_safe_exit(int code) { set_signals_handler(on_rescue_exit, sigerr); set_signals_handler(on_rescue_exit, sigterm); @@ -294,6 +294,28 @@ static void safe_exit(int code) exit(code); } +/* + * Do a safe exit + */ +#if WITH_SIG_MONITOR_NO_DEFERRED_EXIT +# define safe_exit(x) direct_safe_exit(x) +#else +#include "jobs.h" +static void exit_job(int signum, void* arg) +{ + exiting = (int)(intptr_t)arg; + if (signum) + on_rescue_exit(signum); + exit(exiting); +} + +static void safe_exit(int code) +{ + if (jobs_queue(safe_exit, 0, exit_job, (void*)(intptr_t)code)) + direct_safe_exit(code); +} +#endif + #if !WITH_SIG_MONITOR_DUMPSTACK static inline void safe_dumpstack(int crop, int signum) {}