in Xserver/os/connection.c, the Xserver calls CheckConnections() to check the validity of the client file descriptors. Even though the select is called with a timeout of zero, it is still possible for the the OS to return EINTR. When this happens, an active client connection is dropped from the server. The LogWrite() is what I used to prove this is happening. It can be removed. N.B.: this patch includes the patch made for bug #7876. --- xc/programs/Xserver/os/connection.c 2004-04-23 14:54:28.000000000 -0500 +++ xc/programs/Xserver/os/connection.c 2006-12-04 13:09:39.565957120 -0600 @@ -1056,8 +1056,11 @@ CheckConnections(void) FD_ZERO(&tmask); FD_SET(curclient, &tmask); r = Select (curclient + 1, &tmask, NULL, NULL, ¬ime); - if (r < 0) - CloseDownClient(clients[ConnectionTranslation[curclient]]); + if (r < 0 && GetConnectionTranslation(curclient) > 0) + LogWrite(1, "CheckConnections: close down client, errno %d\n", errno); + if ((EINTR != errno) && (EAGAIN != errno)) + CloseDownClient(clients[ConnectionTranslation[curclient]]); + } mask &= ~((fd_mask)1 << curoff); } }
Sorry about the phenomenal bug spam, guys. Adding xorg-team@ to the QA contact so bugs don't get lost in future.
I reviewed the current git version of xorg/xserver/os/connection.c, and see that this problem still exists. Any way to get this fix in to xorg ?
Thanks, I've pushed the fix for both to master, but want to wait until it's been properly tested until I cherry pick into the 1.4 branch. Thanks for the patch. I made a small modification: I made select continue until we stop getting either EINTR or EAGAIN, so we can actually determine whether or not the connection's dead. Also, I applied it to the win32 part.
(Leaving open only for 1.4.1. It's fixed in master, I think.)
This has even been pushed into 1.4 branch.
Use of freedesktop.org services, including Bugzilla, is subject to our Code of Conduct. How we collect and use information is described in our Privacy Policy.