|
When a wayland compositor gets an EAGAIN error whenever sending or receiving event(s) to a client in the wl_closure_send() or the wl_closure_queue(), the error variable of the wl_client for the client will be set to true and the client is going to be killed by the compositor later soon. This patch fixes the problem by updating the socket fd's event mask as we're doing in wl_display_flush_clients() for having another chance to do it again.
Actually, this kind of problem can be watched in an environment in which massive input events are coming from multi-touch screen or multi-pen devices. In this kind of environment, a client receiving the massive input events are trying to drawing something very hard but it's being killed sooner or later. With the given patch, the client receiving the input events is not being destroyed and is working well even though it doesn't get the whole input events from the compositor.
Signed-off-by: jeon <[email protected]>
--- src/wayland-server.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/src/wayland-server.c b/src/wayland-server.c index eae8d2e..5afaa28 100644 --- a/src/wayland-server.c +++ b/src/wayland-server.c @@ -222,8 +222,15 @@ handle_array(struct wl_resource *resource, uint32_t opcode, log_closure(resource, closure, true); - if (send_func(closure, resource->client->connection)) - resource->client->error = 1; + if (send_func(closure, resource->client->connection)) { + if (errno == EAGAIN) { + wl_event_source_fd_update(resource->client->source, + WL_EVENT_WRITABLE | + WL_EVENT_READABLE); + } else { + resource->client->error = 1; + } + } wl_closure_destroy(closure); }
-- 2.7.4 ![]() |