dix: Praise clients which haven't run for a while, rather than idle clients
authorKeith Packard <keithp@keithp.com>
Wed, 22 Jan 2014 19:01:59 +0000 (11:01 -0800)
committerKeith Packard <keithp@keithp.com>
Thu, 23 Jan 2014 18:10:28 +0000 (10:10 -0800)
A client which is ready, but hasn't run for a while, should receive
the same benefit as one which has simply been idle for a while. Use
the smart_stop_tick to see how long it has been since a client has
run instead of smart_check_tick, which got reset each time a client
was ready, even if it didn't get to run.

Reported-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Keith Packard <keithp@keithp.com>
Tested-by: Chris Wilson <chris@chris-wilson.co.uk>
dix/dispatch.c
include/dixstruct.h

index e28270c..9a5658d 100644 (file)
@@ -260,12 +260,11 @@ SmartScheduleClient(int *clientReady, int nready)
     for (i = 0; i < nready; i++) {
         client = clientReady[i];
         pClient = clients[client];
-        /* Praise clients which are idle */
-        if ((now - pClient->smart_check_tick) >= idle) {
+        /* Praise clients which haven't run in a while */
+        if ((now - pClient->smart_stop_tick) >= idle) {
             if (pClient->smart_priority < 0)
                 pClient->smart_priority++;
         }
-        pClient->smart_check_tick = now;
 
         /* check priority to select best client */
         robin =
@@ -3424,7 +3423,6 @@ InitClient(ClientPtr client, int i, void *ospriv)
     QueryMinMaxKeyCodes(&client->minKC, &client->maxKC);
     client->smart_start_tick = SmartScheduleTime;
     client->smart_stop_tick = SmartScheduleTime;
-    client->smart_check_tick = SmartScheduleTime;
     client->clientIds = NULL;
 }
 
index a11729b..6c13895 100644 (file)
@@ -106,7 +106,6 @@ typedef struct _Client {
 
     int smart_start_tick;
     int smart_stop_tick;
-    int smart_check_tick;
 
     DeviceIntPtr clientPtr;
     ClientIdPtr clientIds;