summaryrefslogtreecommitdiff
path: root/os
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2016-05-19 13:59:54 -0700
committerAdam Jackson <ajax@redhat.com>2016-07-21 15:04:47 -0400
commit8f1edf4bd3a1f050ce9eeb5eac45dd1a8f7a6d5e (patch)
treee2763a8e89c750ba2ab56c7b02f6ef42534f7cfb /os
parentd6eff3c31e8289881a3aa9b858e5710d0f741db0 (diff)
dix: Use list for ready clients
This converts the dispatch loop into using a list of ready clients instead of an array. This changes the WaitForSomething API so that it notifies DIX when a client becomes ready to read, instead of returning the set of ready clients. Signed-off-by: Keith Packard <keithp@keithp.com> Reviewed-by: Adam Jackson <ajax@redhat.com>
Diffstat (limited to 'os')
-rw-r--r--os/WaitFor.c36
-rw-r--r--os/connection.c5
-rw-r--r--os/io.c1
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);
diff --git a/os/io.c b/os/io.c
index 596deff47..36527dc56 100644
--- a/os/io.c
+++ b/os/io.c
@@ -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