On Tue, Jul 09, 2013 at 02:10:45PM +0100, Neil Roberts wrote:
> If EOF is encountered while reading from the Wayland socket,
> wl_display_read_events() will now return -1 so that it will be treated
> as an error. The documentation for this function states that it will
> set errno when there is an error so it additionally makes up an errno
> of EPIPE.

Ah, yes, good catch.  The multi-thread behaviour of
wl_display_read_events() allows mulitple threads to call into it, but
only one of the threads will get to read the data from the socket.
When I wrote this I was thinking that all other threads will call
recvmsg non-blocking and return 0 bytes.  But 0 means "orderly
shutdown" of course, while -1 and errno = EAGAIN is "no data right
now".  We do handle that case, but return -1, which the higher-level
code will treat as an error.  I'll fix that in a follow-up commit.

> If we don't do this then when the compositor quits the Wayland socket
> will be become ready for reading but wl_display_dispatch will do
> nothing which typically makes the application take up 100% CPU. In
> particular eglSwapBuffers will likely get stuck in an infinite busy
> loop because it repeatedly calls wl_display_dispatch_queue while it
> waits for the frame callback.

Yes... I wonder why gtk+ doesn't handle POLLHUP and quits from that
though.

> ---
>  src/wayland-client.c | 9 +++++++++
>  1 file changed, 9 insertions(+)
> 
> diff --git a/src/wayland-client.c b/src/wayland-client.c
> index cb091ab..9400bcd 100644
> --- a/src/wayland-client.c
> +++ b/src/wayland-client.c
> @@ -877,6 +877,15 @@ read_events(struct wl_display *display)
>                               display_fatal_error(display, errno);
>                       return -1;
>               }
> +             else if (total == 0) {
> +                     /* The compositor has closed the socket. This
> +                      * should be considered an error so we'll fake
> +                      * an errno */
> +                     errno = EPIPE;

Yeah, EPIPE is fine I suppose.

thanks,
Kristian

> +                     display_fatal_error(display, errno);
> +                     return -1;
> +             }
> +
>               for (rem = total; rem >= 8; rem -= size) {
>                       size = queue_event(display, rem);
>                       if (size == -1) {
> -- 
> 1.7.11.3.g3c3efa5
> 
> _______________________________________________
> wayland-devel mailing list
> wayland-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to