summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/compositor.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/src/compositor.c b/src/compositor.c
index add78af..564153b 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -74,6 +74,12 @@ to_ivi_compositor(struct weston_compositor *ec)
}
static void
+sigint_helper(int sig)
+{
+ raise(SIGUSR2);
+}
+
+static void
handle_output_destroy(struct wl_listener *listener, void *data)
{
struct ivi_output *output;
@@ -1625,6 +1631,7 @@ int wet_main(int argc, char *argv[], const struct weston_testsuite_data *test_da
struct weston_log_subscriber *logger;
int ret = EXIT_FAILURE;
bool xwayland = false;
+ struct sigaction action;
const struct weston_option core_options[] = {
{ WESTON_OPTION_STRING, "backend", 'B', &backend },
@@ -1707,11 +1714,26 @@ int wet_main(int argc, char *argv[], const struct weston_testsuite_data *test_da
signals[0] = wl_event_loop_add_signal(loop, SIGTERM, on_term_signal,
display);
- signals[1] = wl_event_loop_add_signal(loop, SIGINT, on_term_signal,
+ signals[1] = wl_event_loop_add_signal(loop, SIGUSR2, on_term_signal,
display);
signals[2] = wl_event_loop_add_signal(loop, SIGCHLD, sigchld_handler,
display);
+ /* When debugging the compositor, if use wl_event_loop_add_signal() to
+ * catch SIGINT, the debugger can't catch it, and attempting to stop
+ * the compositor from within the debugger results in weston exiting
+ * cleanly.
+ *
+ * Instead, use the sigaction() function, which sets up the signal in a
+ * way that gdb can successfully catch, but have the handler for SIGINT
+ * send SIGUSR2 (xwayland uses SIGUSR1), which we catch via
+ * wl_event_loop_add_signal().
+ */
+ action.sa_handler = sigint_helper;
+ sigemptyset(&action.sa_mask);
+ action.sa_flags = 0;
+ sigaction(SIGINT, &action, NULL);
+
for (size_t i = 0; i < ARRAY_LENGTH(signals); ++i)
if (!signals[i])
goto error_signals;