Added system signal handling to Linux version

(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>
__archive__
Mateusz Manowiecki 2015-01-05 16:40:16 +01:00 committed by Paul Fertser
parent ef0fa97a71
commit 5087a95548
3 changed files with 34 additions and 12 deletions

View File

@ -277,30 +277,28 @@ static int openocd_thread(int argc, char *argv[], struct command_context *cmd_ct
int ret; int ret;
if (parse_cmdline_args(cmd_ctx, argc, argv) != ERROR_OK) if (parse_cmdline_args(cmd_ctx, argc, argv) != ERROR_OK)
return EXIT_FAILURE; return ERROR_FAIL;
if (server_preinit() != ERROR_OK) if (server_preinit() != ERROR_OK)
return EXIT_FAILURE; return ERROR_FAIL;
ret = parse_config_file(cmd_ctx); ret = parse_config_file(cmd_ctx);
if (ret != ERROR_OK) if (ret != ERROR_OK)
return EXIT_FAILURE; return ERROR_FAIL;
ret = server_init(cmd_ctx); ret = server_init(cmd_ctx);
if (ERROR_OK != ret) if (ERROR_OK != ret)
return EXIT_FAILURE; return ERROR_FAIL;
if (init_at_startup) { if (init_at_startup) {
ret = command_run_line(cmd_ctx, "init"); ret = command_run_line(cmd_ctx, "init");
if (ERROR_OK != ret) if (ERROR_OK != ret)
return EXIT_FAILURE; return ERROR_FAIL;
} }
server_loop(cmd_ctx); server_loop(cmd_ctx);
server_quit(); return server_quit();
return ret;
} }
/* normally this is the main() function entry, but if OpenOCD is linked /* 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(); adapter_quit();
if (ERROR_FAIL == ret)
return EXIT_FAILURE;
else if (ERROR_OK != ret)
exit_on_signal(ret);
return ret; return ret;
} }

View File

@ -47,6 +47,9 @@ static struct service *services;
/* shutdown_openocd == 1: exit the main event loop, and quit the debugger */ /* shutdown_openocd == 1: exit the main event loop, and quit the debugger */
static int shutdown_openocd; static int shutdown_openocd;
/* store received signal to exit application by killing ourselves */
static int last_signal;
/* set the polling period to 100ms */ /* set the polling period to 100ms */
static int polling_period = 100; static int polling_period = 100;
@ -505,12 +508,15 @@ BOOL WINAPI ControlHandler(DWORD dwCtrlType)
shutdown_openocd = 1; shutdown_openocd = 1;
return TRUE; return TRUE;
} }
#endif
void sig_handler(int sig) void sig_handler(int sig)
{ {
/* store only first signal that hits us */
if (!last_signal)
last_signal = sig;
shutdown_openocd = 1; shutdown_openocd = 1;
} }
#endif
int server_preinit(void) int server_preinit(void)
{ {
@ -532,11 +538,11 @@ int server_preinit(void)
/* register ctrl-c handler */ /* register ctrl-c handler */
SetConsoleCtrlHandler(ControlHandler, TRUE); SetConsoleCtrlHandler(ControlHandler, TRUE);
signal(SIGBREAK, sig_handler);
#endif
signal(SIGINT, sig_handler); signal(SIGINT, sig_handler);
signal(SIGTERM, sig_handler); signal(SIGTERM, sig_handler);
signal(SIGBREAK, sig_handler);
signal(SIGABRT, sig_handler); signal(SIGABRT, sig_handler);
#endif
return ERROR_OK; return ERROR_OK;
} }
@ -557,9 +563,21 @@ int server_quit(void)
#ifdef _WIN32 #ifdef _WIN32
WSACleanup(); WSACleanup();
SetConsoleCtrlHandler(ControlHandler, FALSE); SetConsoleCtrlHandler(ControlHandler, FALSE);
#endif
return ERROR_OK; 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) int connection_write(struct connection *connection, const void *data, int len)

View File

@ -78,6 +78,7 @@ int add_service(char *name, const char *port,
int server_preinit(void); int server_preinit(void);
int server_init(struct command_context *cmd_ctx); int server_init(struct command_context *cmd_ctx);
int server_quit(void); int server_quit(void);
void exit_on_signal(int);
int server_loop(struct command_context *command_context); int server_loop(struct command_context *command_context);