summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/compositor.c4
-rw-r--r--src/ivi-compositor.h2
-rw-r--r--src/shell.c32
3 files changed, 37 insertions, 1 deletions
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 <string.h>
#include <sys/socket.h>
#include <sys/types.h>
+#include <sys/wait.h>
#include <unistd.h>
#include <libweston/libweston.h>
#include <libweston/config-parser.h>
@@ -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)
{