From 51c769f32e33abac7aba0d4f7c6a4693ec413d74 Mon Sep 17 00:00:00 2001 From: Pekka Paalanen Date: Mon, 2 Jan 2012 16:03:26 +0200 Subject: [PATCH] compositor: clean up signal event sources on exit Fixes some Valgrind errors. Signed-off-by: Pekka Paalanen --- compositor/compositor.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/compositor/compositor.c b/compositor/compositor.c index 8b3ba3c..99f8cbb 100644 --- a/compositor/compositor.c +++ b/compositor/compositor.c @@ -2068,6 +2068,7 @@ int main(int argc, char *argv[]) { struct wl_display *display; struct wlsc_compositor *ec; + struct wl_event_source *signals[4]; struct wl_event_loop *loop; int o, xserver = 0; void *shell_module, *backend_module; @@ -2079,6 +2080,7 @@ int main(int argc, char *argv[]) char *shell = NULL; char *p; int option_idle_time = 300; + int i; static const char opts[] = "B:b:o:S:i:s:x"; static const struct option longopts[ ] = { @@ -2123,12 +2125,16 @@ int main(int argc, char *argv[]) display = wl_display_create(); loop = wl_display_get_event_loop(display); - wl_event_loop_add_signal(loop, SIGTERM, on_term_signal, display); - wl_event_loop_add_signal(loop, SIGINT, on_term_signal, display); - wl_event_loop_add_signal(loop, SIGQUIT, on_term_signal, display); + 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, + display); + signals[2] = wl_event_loop_add_signal(loop, SIGQUIT, on_term_signal, + display); wl_list_init(&child_process_list); - wl_event_loop_add_signal(loop, SIGCHLD, sigchld_handler, NULL); + signals[3] = wl_event_loop_add_signal(loop, SIGCHLD, sigchld_handler, + NULL); if (!backend) { if (getenv("WAYLAND_DISPLAY")) @@ -2185,6 +2191,9 @@ int main(int argc, char *argv[]) if (ec->has_bind_display) ec->unbind_display(ec->display, display); + for (i = ARRAY_LENGTH(signals); i;) + wl_event_source_remove(signals[--i]); + ec->destroy(ec); wl_display_destroy(display); -- 2.7.4