From: bones_was_here Date: Thu, 7 Mar 2024 20:31:33 +0000 (+1000) Subject: sys: allow the platform to handle crashes after DP does X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=556b15a9b78a7d873238688d93432ed43f997916;p=xonotic%2Fdarkplaces.git sys: allow the platform to handle crashes after DP does As suggested by divVerent in chat. In SDL builds (including when using -dedicated on the cmdline) the OS handler runs after the user clicks OK on the SDL dialog. Signed-off-by: bones_was_here --- diff --git a/host.c b/host.c index 59496a58..fbe40b6a 100644 --- a/host.c +++ b/host.c @@ -683,7 +683,7 @@ void Host_Main(void) oldtime = Sys_DirtyTime(); // Main event loop - while(host.state != host_shutdown) + while(host.state < host_shutdown) // see Sys_HandleCrash() comments { // Something bad happened, or the server disconnected if (setjmp(host.abortframe)) diff --git a/host.h b/host.h index 986b3224..779ccc84 100644 --- a/host.h +++ b/host.h @@ -20,10 +20,11 @@ struct cmd_state_s; typedef enum host_state_e { - host_shutdown, host_init, host_loading, host_active, + // states >= host_shutdown cause graceful shutdown, see Sys_HandleCrash() comments + host_shutdown, host_failing, ///< crashing host_failed ///< crashed or aborted, SDL dialog open } host_state_t; diff --git a/sys_shared.c b/sys_shared.c index 4c714cc0..745a839e 100644 --- a/sys_shared.c +++ b/sys_shared.c @@ -1011,7 +1011,11 @@ static void Sys_HandleCrash(int sig) Sys_SDL_Dialog("Engine Crash", dialogtext); fflush(stderr); // not async-signal-safe :( - _Exit(sig); + + // Continue execution with default signal handling. + // A real crash will be re-triggered so the platform can handle it, + // a fake crash (kill -SEGV) will cause a graceful shutdown. + signal(sig, SIG_DFL); } static void Sys_HandleSignal(int sig)