Added system signal handling to Linux version 43/2443/3
authorMateusz Manowiecki <segmentation@fault.pl>
Mon, 5 Jan 2015 15:40:16 +0000 (16:40 +0100)
committerPaul Fertser <fercerpav@gmail.com>
Mon, 9 Mar 2015 06:25:45 +0000 (06:25 +0000)
(with http://www.cons.org/cracauer/sigint.html in mind)

Change-Id: I15f559bc1122a408c3fb9338ba55c16fab3187e1
Signed-off-by: Mateusz Manowiecki <segmentation@fault.pl>
Reviewed-on: http://openocd.zylin.com/2443
Tested-by: jenkins
Reviewed-by: Paul Fertser <fercerpav@gmail.com>
src/openocd.c
src/server/server.c
src/server/server.h

index 758febb..b0dd21a 100644 (file)
@@ -277,30 +277,28 @@ static int openocd_thread(int argc, char *argv[], struct command_context *cmd_ct
        int ret;
 
        if (parse_cmdline_args(cmd_ctx, argc, argv) != ERROR_OK)
-               return EXIT_FAILURE;
+               return ERROR_FAIL;
 
        if (server_preinit() != ERROR_OK)
-               return EXIT_FAILURE;
+               return ERROR_FAIL;
 
        ret = parse_config_file(cmd_ctx);
        if (ret != ERROR_OK)
-               return EXIT_FAILURE;
+               return ERROR_FAIL;
 
        ret = server_init(cmd_ctx);
        if (ERROR_OK != ret)
-               return EXIT_FAILURE;
+               return ERROR_FAIL;
 
        if (init_at_startup) {
                ret = command_run_line(cmd_ctx, "init");
                if (ERROR_OK != ret)
-                       return EXIT_FAILURE;
+                       return ERROR_FAIL;
        }
 
        server_loop(cmd_ctx);
 
-       server_quit();
-
-       return ret;
+       return server_quit();
 }
 
 /* normally this is the main() function entry, but if OpenOCD is linked
@@ -338,5 +336,10 @@ int openocd_main(int argc, char *argv[])
 
        adapter_quit();
 
+       if (ERROR_FAIL == ret)
+               return EXIT_FAILURE;
+       else if (ERROR_OK != ret)
+               exit_on_signal(ret);
+
        return ret;
 }
index 9f9f2f1..9832762 100644 (file)
@@ -47,6 +47,9 @@ static struct service *services;
 /* shutdown_openocd == 1: exit the main event loop, and quit the debugger */
 static int shutdown_openocd;
 
+/* store received signal to exit application by killing ourselves */
+static int last_signal;
+
 /* set the polling period to 100ms */
 static int polling_period = 100;
 
@@ -505,12 +508,15 @@ BOOL WINAPI ControlHandler(DWORD dwCtrlType)
        shutdown_openocd = 1;
        return TRUE;
 }
+#endif
 
 void sig_handler(int sig)
 {
+       /* store only first signal that hits us */
+       if (!last_signal)
+               last_signal = sig;
        shutdown_openocd = 1;
 }
-#endif
 
 int server_preinit(void)
 {
@@ -532,11 +538,11 @@ int server_preinit(void)
        /* register ctrl-c handler */
        SetConsoleCtrlHandler(ControlHandler, TRUE);
 
+       signal(SIGBREAK, sig_handler);
+#endif
        signal(SIGINT, sig_handler);
        signal(SIGTERM, sig_handler);
-       signal(SIGBREAK, sig_handler);
        signal(SIGABRT, sig_handler);
-#endif
 
        return ERROR_OK;
 }
@@ -557,9 +563,21 @@ int server_quit(void)
 #ifdef _WIN32
        WSACleanup();
        SetConsoleCtrlHandler(ControlHandler, FALSE);
-#endif
 
        return ERROR_OK;
+#endif
+
+       /* return signal number so we can kill ourselves */
+       return last_signal;
+}
+
+void exit_on_signal(int sig)
+{
+#ifndef _WIN32
+       /* bring back default system handler and kill yourself */
+       signal(sig, SIG_DFL);
+       kill(getpid(), sig);
+#endif
 }
 
 int connection_write(struct connection *connection, const void *data, int len)
index b444939..34c870a 100644 (file)
@@ -78,6 +78,7 @@ int add_service(char *name, const char *port,
 int server_preinit(void);
 int server_init(struct command_context *cmd_ctx);
 int server_quit(void);
+void exit_on_signal(int);
 
 int server_loop(struct command_context *command_context);