summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Maatman <blackwolf12333@gmail.com>2013-03-27 22:38:53 +0100
committerKristian Høgsberg <krh@bitplanet.net>2013-03-27 22:57:33 -0400
commite5b42e4466fecc940d5573d78f7b4c0f06777d66 (patch)
treeb461c3f71d1bc737931d5f6f31fc23fe2054aa8a
parent848e2e670ec889e1be07635793f47e15058e20bb (diff)
Added handler for SIGABRT
-rw-r--r--src/compositor.c29
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;