diff options
Diffstat (limited to 'os')
-rw-r--r-- | os/WaitFor.c | 36 | ||||
-rw-r--r-- | os/connection.c | 5 | ||||
-rw-r--r-- | os/io.c | 1 |
3 files changed, 22 insertions, 20 deletions
diff --git a/os/WaitFor.c b/os/WaitFor.c index 7bdd39987..8164c30dd 100644 --- a/os/WaitFor.c +++ b/os/WaitFor.c @@ -142,8 +142,8 @@ static volatile OsTimerPtr timers = NULL; * pClientsReady is an array to store ready client->index values into. *****************/ -int -WaitForSomething(int *pClientsReady) +Bool +WaitForSomething(Bool are_ready) { int i; struct timeval waittime, *wt; @@ -154,7 +154,6 @@ WaitForSomething(int *pClientsReady) int selecterr; static int nready; CARD32 now = 0; - Bool someReady = FALSE; Bool someNotifyWriteReady = FALSE; FD_ZERO(&clientsReadable); @@ -174,11 +173,9 @@ WaitForSomething(int *pClientsReady) /* deal with any blocked jobs */ if (workQueue) ProcessWorkQueue(); - if (XFD_ANYSET(&ClientsWithInput)) { + + if (are_ready) { timeout = 0; - someReady = TRUE; - } - if (someReady) { XFD_COPYSET(&AllSockets, &LastSelectMask); XFD_UNSET(&LastSelectMask, &ClientsWithInput); } @@ -227,12 +224,12 @@ WaitForSomething(int *pClientsReady) WakeupHandler(i); if (i <= 0) { /* An error or timeout occurred */ if (dispatchException) - return 0; + return FALSE; if (i < 0) { if (selecterr == EBADF) { /* Some client disconnected */ CheckConnections(); if (!XFD_ANYSET(&AllClients)) - return 0; + return FALSE; } else if (selecterr == EINVAL) { FatalError("WaitForSomething(): select: %s\n", @@ -243,7 +240,7 @@ WaitForSomething(int *pClientsReady) strerror(selecterr)); } } - else if (someReady) { + else if (are_ready) { /* * If no-one else is home, bail quickly */ @@ -252,7 +249,7 @@ WaitForSomething(int *pClientsReady) break; } if (*checkForInput[0] != *checkForInput[1]) - return 0; + return FALSE; if (timers) { int expired = 0; @@ -267,7 +264,7 @@ WaitForSomething(int *pClientsReady) DoTimer(timers, now, &timers); OsReleaseSignals(); - return 0; + return FALSE; } } } @@ -288,12 +285,11 @@ WaitForSomething(int *pClientsReady) DoTimer(timers, now, &timers); OsReleaseSignals(); - return 0; + return FALSE; } } } - if (someReady) - XFD_ORSET(&LastSelectMask, &ClientsWithInput, &LastSelectMask); + if (AnyWritesPending) { XFD_ANDSET(&clientsWritable, &LastSelectWriteMask, &ClientsWriteBlocked); if (XFD_ANYSET(&clientsWritable)) { @@ -316,11 +312,12 @@ WaitForSomething(int *pClientsReady) if (XFD_ANYSET(&tmp_set) || someNotifyWriteReady) HandleNotifyFds(); - if (XFD_ANYSET(&clientsReadable)) + if (are_ready || XFD_ANYSET(&clientsReadable)) break; + /* check here for DDXes that queue events during Block/Wakeup */ if (*checkForInput[0] != *checkForInput[1]) - return 0; + return FALSE; } } @@ -345,7 +342,8 @@ WaitForSomething(int *pClientsReady) curclient = XFD_FD(&savedClientsReadable, i); client_index = GetConnectionTranslation(curclient); #endif - pClientsReady[nready++] = client_index; + nready++; + mark_client_ready(clients[client_index]); #ifndef WIN32 clientsReadable.fds_bits[i] &= ~(((fd_mask) 1L) << curclient); } @@ -358,7 +356,7 @@ WaitForSomething(int *pClientsReady) if (nready) SmartScheduleStartTimer(); - return nready; + return TRUE; } void diff --git a/os/connection.c b/os/connection.c index ad949c90e..9e0c97616 100644 --- a/os/connection.c +++ b/os/connection.c @@ -1232,6 +1232,7 @@ IgnoreClient(ClientPtr client) return; isItTimeToYield = TRUE; + mark_client_not_ready(client); if (!GrabInProgress || FD_ISSET(connection, &AllClients)) { if (FD_ISSET(connection, &ClientsWithInput)) FD_SET(connection, &IgnoredClientsWithInput); @@ -1273,8 +1274,10 @@ AttendClient(ClientPtr client) FD_SET(connection, &AllClients); FD_SET(connection, &AllSockets); FD_SET(connection, &LastSelectMask); - if (FD_ISSET(connection, &IgnoredClientsWithInput)) + if (FD_ISSET(connection, &IgnoredClientsWithInput)) { FD_SET(connection, &ClientsWithInput); + mark_client_ready(client); + } } else { FD_SET(connection, &SavedAllClients); @@ -354,6 +354,7 @@ ReadRequestFromClient(ClientPtr client) oci->size - oci->bufcnt); if (result <= 0) { if ((result < 0) && ETEST(errno)) { + mark_client_not_ready(client); #if defined(SVR4) && defined(__i386__) && !defined(__sun) if (0) #endif |