[PATCH] wayland-client: Treat EOF when reading the wayland socket as an error

Neil Roberts neil at linux.intel.com
Tue Jul 9 06:10:45 PDT 2013


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.

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.
---
 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;
+			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



More information about the wayland-devel mailing list