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__
parent
ef0fa97a71
commit
5087a95548
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue