From e8761762fcd03d3f561c0a0b761d609ded41c8c3 Mon Sep 17 00:00:00 2001 From: Marius Vlad Date: Tue, 20 Sep 2022 14:34:31 +0300 Subject: [PATCH] compositor: Add missing SIGCHLD handler We seem to be missing a SIGCHLD signal handlers so this patch adds one similarity to what weston has. Bug-AGL: SPEC-4570 Signed-off-by: Marius Vlad Change-Id: I137af4199c3d543fed940bbe289989095b114b74 --- src/compositor.c | 4 +++- src/ivi-compositor.h | 2 ++ src/shell.c | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/compositor.c b/src/compositor.c index dbc89e2..add78af 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -1608,7 +1608,7 @@ int wet_main(int argc, char *argv[], const struct weston_testsuite_data *test_da char *cmdline; struct wl_display *display = NULL; struct wl_event_loop *loop; - struct wl_event_source *signals[2] = { 0 }; + struct wl_event_source *signals[3] = { 0 }; struct weston_config_section *section; /* Command line options */ char *backend = NULL; @@ -1709,6 +1709,8 @@ int wet_main(int argc, char *argv[], const struct weston_testsuite_data *test_da display); signals[1] = wl_event_loop_add_signal(loop, SIGINT, on_term_signal, display); + signals[2] = wl_event_loop_add_signal(loop, SIGCHLD, sigchld_handler, + display); for (size_t i = 0; i < ARRAY_LENGTH(signals); ++i) if (!signals[i]) diff --git a/src/ivi-compositor.h b/src/ivi-compositor.h index ebbcc17..3cca0a0 100644 --- a/src/ivi-compositor.h +++ b/src/ivi-compositor.h @@ -480,5 +480,7 @@ void ivi_shell_activate_surface(struct ivi_surface *ivi_surf, struct ivi_shell_seat *ivi_seat, uint32_t flags); +int +sigchld_handler(int signal_number, void *data); #endif diff --git a/src/shell.c b/src/shell.c index cb6e592..96f5c63 100644 --- a/src/shell.c +++ b/src/shell.c @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -928,6 +929,37 @@ struct process_info { char *path; }; +int +sigchld_handler(int signal_number, void *data) +{ + struct weston_process *p; + struct ivi_compositor *ivi = data; + int status; + pid_t pid; + + while ((pid = waitpid(-1, &status, WNOHANG)) > 0) { + wl_list_for_each(p, &ivi->child_process_list, link) { + if (p->pid == pid) + break; + } + + if (&p->link == &ivi->child_process_list) { + weston_log("unknown child process exited\n"); + continue; + } + + wl_list_remove(&p->link); + wl_list_init(&p->link); + p->cleanup(p, status); + } + + if (pid < 0 && errno != ECHILD) + weston_log("waitpid error %s\n", strerror(errno)); + + return 1; +} + + static void process_handle_sigchld(struct weston_process *process, int status) { -- 2.16.6