diff options
author | Peter Maatman <blackwolf12333@gmail.com> | 2013-03-27 22:38:53 +0100 |
---|---|---|
committer | Kristian Høgsberg <krh@bitplanet.net> | 2013-03-27 22:57:33 -0400 |
commit | e5b42e4466fecc940d5573d78f7b4c0f06777d66 (patch) | |
tree | b461c3f71d1bc737931d5f6f31fc23fe2054aa8a | |
parent | 848e2e670ec889e1be07635793f47e15058e20bb (diff) |
Added handler for SIGABRT
-rw-r--r-- | src/compositor.c | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/src/compositor.c b/src/compositor.c index b846d8e7..c0275786 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -3307,17 +3307,17 @@ print_backtrace(void) #endif static void -on_segv_signal(int s, siginfo_t *siginfo, void *context) +on_caught_signal(int s, siginfo_t *siginfo, void *context) { - /* This SIGSEGV handler will do a best-effort backtrace, and + /* This signal handler will do a best-effort backtrace, and * then call the backend restore function, which will switch * back to the vt we launched from or ungrab X etc and then * raise SIGTRAP. If we run weston under gdb from X or a - * different vt, and tell gdb "handle SIGSEGV nostop", this + * different vt, and tell gdb "handle *s* nostop", this * will allow weston to switch back to gdb on crash and then - * gdb will catch the crash with SIGTRAP. */ + * gdb will catch the crash with SIGTRAP.*/ - weston_log("caught segv\n"); + weston_log("caught signal: %d\n", s); print_backtrace(); @@ -3326,7 +3326,6 @@ on_segv_signal(int s, siginfo_t *siginfo, void *context) raise(SIGTRAP); } - static void * load_module(const char *name, const char *entrypoint) { @@ -3479,6 +3478,18 @@ usage(int error_code) exit(error_code); } +static void +catch_signals(void) +{ + struct sigaction action; + + action.sa_flags = SA_SIGINFO | SA_RESETHAND; + action.sa_sigaction = on_caught_signal; + sigemptyset(&action.sa_mask); + sigaction(SIGSEGV, &action, NULL); + sigaction(SIGABRT, &action, NULL); +} + int main(int argc, char *argv[]) { int ret = EXIT_SUCCESS; @@ -3486,7 +3497,6 @@ int main(int argc, char *argv[]) struct weston_compositor *ec; struct wl_event_source *signals[4]; struct wl_event_loop *loop; - struct sigaction segv_action; struct weston_compositor *(*backend_init)(struct wl_display *display, int *argc, char *argv[], const char *config_file); @@ -3577,10 +3587,7 @@ int main(int argc, char *argv[]) exit(EXIT_FAILURE); } - segv_action.sa_flags = SA_SIGINFO | SA_RESETHAND; - segv_action.sa_sigaction = on_segv_signal; - sigemptyset(&segv_action.sa_mask); - sigaction(SIGSEGV, &segv_action, NULL); + catch_signals(); segv_compositor = ec; ec->idle_time = idle_time; |