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 758febb4df7533ddcede040ab007ca7a22af92e5..b0dd21ab2c82bd7a72e038d7801b37bf97eeff42 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 9f9f2f1aa61333223963a1a46164d50cd9fd7b3b..9832762f640dcb69838a60f233fac88527cb6328 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 b444939729d9c7107a721879296736e222cc5411..34c870aabc4a836e07d65ac0225f8b5a63d482f7 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);
 

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)