Commit f14f738a authored by Keith Packard's avatar Keith Packard Committed by Mike Gabriel

dix/os: Merge priority computation into SmartScheduleClient

Backported from X.org: commit 7762a602c1dfdd8cfcf2b8c2281cf4d683d05216 Author: Keith Packard <keithp@keithp.com> Date: Thu May 19 15:05:55 2016 -0700 dix/os: Merge priority computation into SmartScheduleClient Instead of having scheduling done in two places (one in WaitForSomething, and the other in SmartScheduleClient), just stick all of the scheduling in SmartScheduleClient. Signed-off-by: 's avatarKeith Packard <keithp@keithp.com> Reviewed-by: 's avatarAdam Jackson <ajax@redhat.com> Backported-to-NX-by: 's avatarMike Gabriel <mike.gabriel@das-netzwerkteam.de>
parent 6c076cfe
...@@ -240,15 +240,13 @@ void InitProcVectors(void); ...@@ -240,15 +240,13 @@ void InitProcVectors(void);
int int
SmartScheduleClient (int *clientReady, int nready) SmartScheduleClient (int *clientReady, int nready)
{ {
ClientPtr pClient;
int i; int i;
int client; int client;
int bestPrio, best = 0; ClientPtr pClient, best = NULL;
int bestRobin, robin; int bestRobin, robin;
long now = SmartScheduleTime; long now = SmartScheduleTime;
long idle; long idle;
bestPrio = -0x7fffffff;
bestRobin = 0; bestRobin = 0;
idle = 2 * SmartScheduleSlice; idle = 2 * SmartScheduleSlice;
for (i = 0; i < nready; i++) for (i = 0; i < nready; i++)
...@@ -264,13 +262,19 @@ SmartScheduleClient (int *clientReady, int nready) ...@@ -264,13 +262,19 @@ SmartScheduleClient (int *clientReady, int nready)
pClient->smart_check_tick = now; pClient->smart_check_tick = now;
/* check priority to select best client */ /* check priority to select best client */
robin = (pClient->index - SmartLastIndex[pClient->smart_priority-SMART_MIN_PRIORITY]) & 0xff; robin = (pClient->index -
if (pClient->smart_priority > bestPrio || SmartLastIndex[pClient->smart_priority -
(pClient->smart_priority == bestPrio && robin > bestRobin)) SMART_MIN_PRIORITY]) & 0xff;
/* pick the best client */
if (!best ||
pClient->priority > best->priority ||
(pClient->priority == best->priority &&
(pClient->smart_priority > best->smart_priority ||
(pClient->smart_priority == best->smart_priority && robin > bestRobin))))
{ {
bestPrio = pClient->smart_priority; best = pClient;
bestRobin = robin; bestRobin = robin;
best = client;
} }
#ifdef SMART_DEBUG #ifdef SMART_DEBUG
if ((now - SmartLastPrint) >= 5000) if ((now - SmartLastPrint) >= 5000)
...@@ -284,8 +288,7 @@ SmartScheduleClient (int *clientReady, int nready) ...@@ -284,8 +288,7 @@ SmartScheduleClient (int *clientReady, int nready)
SmartLastPrint = now; SmartLastPrint = now;
} }
#endif #endif
pClient = clients[best]; SmartLastIndex[best->smart_priority - SMART_MIN_PRIORITY] = best->index;
SmartLastIndex[bestPrio-SMART_MIN_PRIORITY] = pClient->index;
/* /*
* Set current client pointer * Set current client pointer
*/ */
...@@ -314,7 +317,7 @@ SmartScheduleClient (int *clientReady, int nready) ...@@ -314,7 +317,7 @@ SmartScheduleClient (int *clientReady, int nready)
{ {
SmartScheduleSlice = SmartScheduleInterval; SmartScheduleSlice = SmartScheduleInterval;
} }
return best; return best->index;
} }
#ifndef NXAGENT_SERVER #ifndef NXAGENT_SERVER
......
...@@ -544,17 +544,14 @@ WaitForSomething(int *pClientsReady) ...@@ -544,17 +544,14 @@ WaitForSomething(int *pClientsReady)
#ifndef WIN32 #ifndef WIN32
for (i=0; i<howmany(XFD_SETSIZE, NFDBITS); i++) for (i=0; i<howmany(XFD_SETSIZE, NFDBITS); i++)
{ {
int highest_priority = 0;
while (clientsReadable.fds_bits[i]) while (clientsReadable.fds_bits[i])
{ {
int client_priority, client_index; int client_index;
curclient = ffs (clientsReadable.fds_bits[i]) - 1; curclient = ffs (clientsReadable.fds_bits[i]) - 1;
client_index = /* raphael: modified */ client_index = /* raphael: modified */
ConnectionTranslation[curclient + (i * (sizeof(fd_mask) * 8))]; ConnectionTranslation[curclient + (i * (sizeof(fd_mask) * 8))];
#else #else
int highest_priority = 0;
fd_set savedClientsReadable; fd_set savedClientsReadable;
XFD_COPYSET(&clientsReadable, &savedClientsReadable); XFD_COPYSET(&clientsReadable, &savedClientsReadable);
for (i = 0; i < XFD_SETCOUNT(&savedClientsReadable); i++) for (i = 0; i < XFD_SETCOUNT(&savedClientsReadable); i++)
...@@ -564,40 +561,10 @@ WaitForSomething(int *pClientsReady) ...@@ -564,40 +561,10 @@ WaitForSomething(int *pClientsReady)
curclient = XFD_FD(&savedClientsReadable, i); curclient = XFD_FD(&savedClientsReadable, i);
client_index = GetConnectionTranslation(curclient); client_index = GetConnectionTranslation(curclient);
#endif #endif
#ifdef XSYNC pClientsReady[nready++] = client_index;
/* We implement "strict" priorities.
* Only the highest priority client is returned to
* dix. If multiple clients at the same priority are
* ready, they are all returned. This means that an
* aggressive client could take over the server.
* This was not considered a big problem because
* aggressive clients can hose the server in so many
* other ways :)
*/
client_priority = clients[client_index]->priority;
if (nready == 0 || client_priority > highest_priority)
{
/* Either we found the first client, or we found
* a client whose priority is greater than all others
* that have been found so far. Either way, we want
* to initialize the list of clients to contain just
* this client.
*/
pClientsReady[0] = client_index;
highest_priority = client_priority;
nready = 1;
}
/* the following if makes sure that multiple same-priority
* clients get batched together
*/
else if (client_priority == highest_priority)
#endif
{
pClientsReady[nready++] = client_index;
}
#ifndef WIN32 #ifndef WIN32
clientsReadable.fds_bits[i] &= ~(((fd_mask)1L) << curclient); clientsReadable.fds_bits[i] &= ~(((fd_mask)1L) << curclient);
} }
#else #else
FD_CLR(curclient, &clientsReadable); FD_CLR(curclient, &clientsReadable);
#endif #endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment