diff options
author | eutarass | 2011-06-04 01:05:49 +0000 |
---|---|---|
committer | eutarass | 2011-06-04 01:05:49 +0000 |
commit | 923625f2d6bbeafe9894b264d08c7a73645a3012 (patch) | |
tree | 5289a370be5d5f732817622b66d29b97801cf4e9 /main | |
parent | b24ffad721ac26a3f6a1ca953263bf5566f6a534 (diff) | |
download | org.eclipse.tcf.agent-923625f2d6bbeafe9894b264d08c7a73645a3012.tar.gz org.eclipse.tcf.agent-923625f2d6bbeafe9894b264d08c7a73645a3012.tar.xz org.eclipse.tcf.agent-923625f2d6bbeafe9894b264d08c7a73645a3012.zip |
Bug 331819 - Peers not removed when Channels are reset.
Diffstat (limited to 'main')
-rw-r--r-- | main/main.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/main/main.c b/main/main.c index d34ce743..5a30121b 100644 --- a/main/main.c +++ b/main/main.c @@ -23,6 +23,7 @@ #include <stdlib.h> #include <errno.h> #include <assert.h> +#include <signal.h> #include <framework/asyncreq.h> #include <framework/events.h> #include <framework/errors.h> @@ -37,6 +38,36 @@ static const char * progname; +static void shutdown_event(void * args) { + discovery_stop(); + cancel_event_loop(); +} + +static void signal_handler(int sig) { + if (is_dispatch_thread()) { + discovery_stop(); + signal(sig, SIG_DFL); + raise(sig); + } + else { + post_event(shutdown_event, NULL); + } +} + +#if defined(WIN32) +static BOOL CtrlHandler(DWORD ctrl) { + switch(ctrl) { + case CTRL_C_EVENT: + case CTRL_CLOSE_EVENT: + case CTRL_BREAK_EVENT: + case CTRL_SHUTDOWN_EVENT: + post_event(shutdown_event, NULL); + return TRUE; + } + return FALSE; +} +#endif + #if defined(_WRS_KERNEL) int tcf(void) { #else @@ -163,6 +194,15 @@ int main(int argc, char ** argv) { } discovery_start(); + signal(SIGABRT, signal_handler); + signal(SIGILL, signal_handler); + signal(SIGINT, signal_handler); + signal(SIGTERM, signal_handler); + +#if defined(WIN32) + SetConsoleCtrlHandler((PHANDLER_ROUTINE)CtrlHandler, TRUE); +#endif + /* Process events - must run on the initial thread since ptrace() * returns ECHILD otherwise, thinking we are not the owner. */ run_event_loop(); |