From 8fcbed84cfefcfe648584941587e6d06abf59c3e Mon Sep 17 00:00:00 2001 From: Marius Vlad Date: Mon, 2 Nov 2020 16:51:08 +0200 Subject: wth-receiver: Handle events from the remote side and from the local compositor With this, we fork and let the child deal with the gstreamer pipeline while the parent is still able to process events from the transimtter. Using blocking dispatching function will make the main loop be stuck in processing events without being able to dispatch any handlers that might be due to the requests from the transmistter side. So in order to allow the mainloop (still) handle the events, we fork and let child deal with the gstreamer pipeline. Bug-AGL: SPEC-3675 Signed-off-by: Marius Vlad Change-Id: I50e1d49b55849dc32f611538bad2ce1c676c9a97 --- src/wth-receiver-comm.c | 60 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 20 deletions(-) (limited to 'src/wth-receiver-comm.c') diff --git a/src/wth-receiver-comm.c b/src/wth-receiver-comm.c index e6c0266..0527ecd 100644 --- a/src/wth-receiver-comm.c +++ b/src/wth-receiver-comm.c @@ -34,12 +34,16 @@ ** ** ** ** *******************************************************************************/ +#include +#include #include "wth-receiver-comm.h" #include "wth-receiver-surface.h" #include "wth-receiver-seat.h" #include "wth-receiver-buffer.h" +#include + extern uint16_t tcp_port; extern const char *my_app_id; @@ -59,9 +63,17 @@ static void wthp_ivi_surface_destroy(struct wthp_ivi_surface * ivi_surface) { struct ivisurface *ivisurf = wth_object_get_user_data((struct wth_object *)ivi_surface); - - if (ivisurf->surf->ivi_app_id) - free(ivisurf->surf->ivi_app_id); + struct client *client = ivisurf->appid->client; + + if (client) { + client->pid_destroying = true; + fprintf(stdout, "client pid_destroying to true for client %p pid %d\n", + client, client->pid); + if (kill(client->pid, SIGINT) < 0) { + fprintf(stderr, "Failed to send SIGINT to child %d\n", + client->pid); + } + } free(ivisurf); } @@ -80,34 +92,42 @@ wthp_ivi_app_id_surface_create(struct wthp_ivi_app_id *ivi_application, struct wthp_surface * wthp_surface, struct wthp_ivi_surface *obj) { - struct surface *surface = wth_object_get_user_data((struct wth_object *)wthp_surface); - - /* we destroy it wthp_ivi_surface_implementation:: */ - if (my_app_id) { - surface->ivi_app_id = strdup(my_app_id); - surface->shm_window->app_id = surface->ivi_app_id; - } - - struct ivisurface *ivisurf; + struct surface *surface = + wth_object_get_user_data((struct wth_object *)wthp_surface); + struct application_id *appid = + wth_object_get_user_data((struct wth_object *) ivi_application); + pid_t cpid; - ivisurf = zalloc(sizeof *ivisurf); + struct ivisurface *ivisurf = zalloc(sizeof *ivisurf); if (!ivisurf) { return; } ivisurf->obj = obj; ivisurf->surf = surface; + ivisurf->appid = appid; wthp_ivi_surface_set_interface(obj, &wthp_ivi_surface_implementation, ivisurf); - if (my_app_id) - wth_receiver_weston_main(surface->shm_window, my_app_id, tcp_port); - else - wth_receiver_weston_main(surface->shm_window, app_id, tcp_port); + cpid = fork(); + if (cpid == -1) { + fprintf(stderr, "Failed to fork()\n"); + exit(EXIT_FAILURE); + } + + if (cpid == 0) { + if (my_app_id) + wth_receiver_weston_main(surface->shm_window, my_app_id, tcp_port); + else + wth_receiver_weston_main(surface->shm_window, app_id, tcp_port); + } else { + /* this is parent, in wthp_ivi_surface_destroy() we mark that the + * client should be waited for so wait4() will be blocked. + */ + appid->client->pid = cpid; + } - while (!surface->shm_window->ready) - usleep(1); } static const struct wthp_ivi_app_id_interface wthp_ivi_app_id_implementation = { @@ -387,6 +407,7 @@ client_create(struct receiver *srv, struct wth_connection *conn) disp = wth_connection_get_display(c->connection); wth_display_set_interface(disp, &display_implementation, c); + fprintf(stdout, "Client %p created\n", c); return c; } @@ -444,7 +465,6 @@ receiver_accept_client(struct receiver *srv) wth_error("Failed to accept a connection.\n"); return; } - client = client_create(srv, conn); if (!client) { wth_error("Failed client_create().\n"); -- cgit 1.2.3-korg