diff options
author | Marius Vlad <marius.vlad@collabora.com> | 2020-11-02 16:51:08 +0200 |
---|---|---|
committer | Marius Vlad <marius.vlad@collabora.com> | 2020-12-01 13:07:57 +0200 |
commit | 8fcbed84cfefcfe648584941587e6d06abf59c3e (patch) | |
tree | 4a370a19465e12543e74563fc136cf916554ca6f /src/wth-receiver-comm.c | |
parent | 2373db4b31a646d4936f6700ecc2af857302444b (diff) |
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 <marius.vlad@collabora.com>
Change-Id: I50e1d49b55849dc32f611538bad2ce1c676c9a97
Diffstat (limited to 'src/wth-receiver-comm.c')
-rw-r--r-- | src/wth-receiver-comm.c | 60 |
1 files changed, 40 insertions, 20 deletions
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 <sys/types.h> +#include <signal.h> #include "wth-receiver-comm.h" #include "wth-receiver-surface.h" #include "wth-receiver-seat.h" #include "wth-receiver-buffer.h" +#include <waltham-util.h> + 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"); |