Ensure that rotation updates happen frequently
The smart scheduler is designed to minimize scheduler overhead by increasing the interval between WaitForSomething calls when a single client is running. However, the software rotation code depends on its BlockHandler being invoked for screen updates; the long delays caused by the smart scheduler optimizations means that screen updates can be delayed a long time as well. The change is simple -- prevent the smart scheduler from increasing the scheduling interval while any screen is using software rotation. Signed-off-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
@@ -242,6 +242,7 @@ long SmartScheduleSlice = SMART_SCHEDULE_DEFAULT_INTERVAL;
|
||||
long SmartScheduleInterval = SMART_SCHEDULE_DEFAULT_INTERVAL;
|
||||
long SmartScheduleMaxSlice = SMART_SCHEDULE_MAX_SLICE;
|
||||
long SmartScheduleTime;
|
||||
int SmartScheduleLatencyLimited = 0;
|
||||
static ClientPtr SmartLastClient;
|
||||
static int SmartLastIndex[SMART_MAX_PRIORITY-SMART_MIN_PRIORITY+1];
|
||||
|
||||
@@ -312,7 +313,7 @@ SmartScheduleClient (int *clientReady, int nready)
|
||||
/*
|
||||
* Adjust slice
|
||||
*/
|
||||
if (nready == 1)
|
||||
if (nready == 1 && SmartScheduleLatencyLimited == 0)
|
||||
{
|
||||
/*
|
||||
* If it's been a long time since another client
|
||||
@@ -332,6 +333,23 @@ SmartScheduleClient (int *clientReady, int nready)
|
||||
return best;
|
||||
}
|
||||
|
||||
void
|
||||
EnableLimitedSchedulingLatency(void)
|
||||
{
|
||||
++SmartScheduleLatencyLimited;
|
||||
SmartScheduleSlice = SmartScheduleInterval;
|
||||
}
|
||||
|
||||
void
|
||||
DisableLimitedSchedulingLatency(void)
|
||||
{
|
||||
--SmartScheduleLatencyLimited;
|
||||
|
||||
/* protect against bugs */
|
||||
if (SmartScheduleLatencyLimited < 0)
|
||||
SmartScheduleLatencyLimited = 0;
|
||||
}
|
||||
|
||||
#define MAJOROP ((xReq *)client->requestBuffer)->reqType
|
||||
|
||||
void
|
||||
@@ -351,6 +369,7 @@ Dispatch(void)
|
||||
if (!clientReady)
|
||||
return;
|
||||
|
||||
SmartScheduleSlice = SmartScheduleInterval;
|
||||
while (!dispatchException)
|
||||
{
|
||||
if (*icheck[0] != *icheck[1])
|
||||
@@ -455,6 +474,7 @@ Dispatch(void)
|
||||
KillAllClients();
|
||||
xfree(clientReady);
|
||||
dispatchException &= ~DE_RESET;
|
||||
SmartScheduleLatencyLimited = 0;
|
||||
}
|
||||
|
||||
#undef MAJOROP
|
||||
|
||||
Reference in New Issue
Block a user