<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Oct 13, 2016 at 9:02 AM, Adam Jackson <span dir="ltr"><<a href="mailto:ajax@redhat.com" target="_blank">ajax@redhat.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Currently, when the X server crashes or a client is disconnected with<br>
XKillClient, you get a somewhat confusing error message from libX11<br>
along the lines of:<br>
<br>
XIO:  fatal IO error 11 (Resource temporarily unavailable) on X server ":0"<br>
      after 98 requests (40 known processed) with 0 events remaining.<br>
<br></blockquote><div>I had been wondering about a similar although less verbose message from gvim during server crash.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
What's happening here is the previous recvmsg has thrown EAGAIN, and<br>
since errno is not cleared on success that's the errno that the I/O<br>
error handler sees.<br>
<br></blockquote><div>excellent troubleshooting.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
To fix this, check for POLLHUP explicitly, and if there's no more data<br>
in the socket buffer to read, treat that as an error. We coerce errno to<br>
EPIPE in this case, which triggers the existing EPIPE path in libX11 and<br>
thus generates the much more honest error message:<br>
<br>
X connection to :0 broken (explicit kill or server shutdown).<br>
<br>
Signed-off-by: Adam Jackson <<a href="mailto:ajax@redhat.com">ajax@redhat.com</a>><br>
---<br>
 src/xcb_conn.c | 16 +++++++++++++++-<br>
 1 file changed, 15 insertions(+), 1 deletion(-)<br>
<br>
diff --git a/src/xcb_conn.c b/src/xcb_conn.c<br>
index 7d09637..ad94443 100644<br>
--- a/src/xcb_conn.c<br>
+++ b/src/xcb_conn.c<br>
@@ -45,6 +45,7 @@<br>
 #elif !defined _WIN32<br>
 #include <sys/select.h><br>
 #endif<br>
+#include <sys/ioctl.h><br>
<br>
 #ifdef _WIN32<br>
 #include "xcb_windefs.h"<br>
@@ -451,7 +452,7 @@ int _xcb_conn_wait(xcb_connection_<wbr>t *c, pthread_cond_t *cond, struct iovec **vec<br>
 #if USE_POLL<br>
     memset(&fd, 0, sizeof(fd));<br>
     fd.fd = c->fd;<br>
-    fd.events = POLLIN;<br>
+    fd.events = POLLIN | POLLHUP;<br>
 #else<br>
     FD_ZERO(&rfds);<br>
     FD_SET(c->fd, &rfds);<br>
@@ -484,6 +485,19 @@ int _xcb_conn_wait(xcb_connection_<wbr>t *c, pthread_cond_t *cond, struct iovec **vec<br>
             ret = -1;<br>
             break;<br>
         }<br>
+<br>
+       /* hangup with no data left to read is an error */<br>
+       if (fd.revents & POLLHUP)<br>
+       {<br>
+           int unread = -1;<br>
+           ioctl(c->fd, FIONREAD, &unread);<br>
+           if (unread <= 0)<br>
+           {<br>
+               /* coerce errno to not be EAGAIN */<br>
+               errno = EPIPE;<br>
+               ret = -1;<br>
+           }<br>
+       }<br>
 #else<br>
         ret = select(c->fd + 1, &rfds, &wfds, 0, 0);<br>
 #endif<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.9.3<br>
<br>
______________________________<wbr>_________________<br>
Xcb mailing list<br>
<a href="mailto:Xcb@lists.freedesktop.org">Xcb@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/xcb" rel="noreferrer" target="_blank">https://lists.freedesktop.org/<wbr>mailman/listinfo/xcb</a></font></span></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div>--</div><div><div>Ben Hildred</div><div>Automation Support Services</div></div><div>303 815 6721</div></div>
</div></div>