diff options
Diffstat (limited to 'x11-servers')
-rw-r--r-- | x11-servers/xorg-server/files/patch-Xserver-Xext-sync.c | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/x11-servers/xorg-server/files/patch-Xserver-Xext-sync.c b/x11-servers/xorg-server/files/patch-Xserver-Xext-sync.c new file mode 100644 index 000000000000..24dd5fdb75fd --- /dev/null +++ b/x11-servers/xorg-server/files/patch-Xserver-Xext-sync.c @@ -0,0 +1,90 @@ +--- Xext/sync.c.orig 2008-11-05 10:52:17.000000000 -0600 ++++ Xext/sync.c 2009-03-08 17:04:38.000000000 -0500 +@@ -2533,7 +2533,7 @@ + * IDLETIME implementation + */ + +-static pointer IdleTimeCounter; ++static SyncCounter *IdleTimeCounter; + static XSyncValue *pIdleTimeValueLess; + static XSyncValue *pIdleTimeValueGreater; + +@@ -2545,38 +2545,69 @@ + } + + static void +-IdleTimeBlockHandler (pointer env, +- struct timeval **wt, +- pointer LastSelectMask) ++IdleTimeBlockHandler(pointer env, struct timeval **wt, pointer LastSelectMask) + { +- XSyncValue idle; ++ XSyncValue idle, old_idle; ++ SyncTriggerList *list = IdleTimeCounter->pTriglist; ++ SyncTrigger *trig; + + if (!pIdleTimeValueLess && !pIdleTimeValueGreater) + return; + ++ old_idle = IdleTimeCounter->value; + IdleTimeQueryValue (NULL, &idle); ++ IdleTimeCounter->value = idle; /* push, so CheckTrigger works */ + + if (pIdleTimeValueLess && + XSyncValueLessOrEqual (idle, *pIdleTimeValueLess)) + { +- AdjustWaitForDelay (wt, 0); ++ /* ++ * We've been idle for less than the threshold value, and someone ++ * wants to know about that, but now we need to know whether they ++ * want level or edge trigger. Check the trigger list against the ++ * current idle time, and if any succeed, bomb out of select() ++ * immediately so we can reschedule. ++ */ ++ ++ for (list = IdleTimeCounter->pTriglist; list; list = list->next) { ++ trig = list->pTrigger; ++ if (trig->CheckTrigger(trig, old_idle)) { ++ AdjustWaitForDelay(wt, 0); ++ break; ++ } ++ } + } + else if (pIdleTimeValueGreater) + { +- unsigned long timeout = 0; ++ /* ++ * There's a threshold in the positive direction. If we've been ++ * idle less than it, schedule a wakeup for sometime in the future. ++ * If we've been idle more than it, and someone wants to know about ++ * that level-triggered, schedule an immediate wakeup. ++ */ ++ unsigned long timeout = -1; + +- if (XSyncValueLessThan (idle, *pIdleTimeValueGreater)) +- { ++ if (XSyncValueLessThan (idle, *pIdleTimeValueGreater)) { + XSyncValue value; + Bool overflow; + + XSyncValueSubtract (&value, *pIdleTimeValueGreater, + idle, &overflow); +- timeout = XSyncValueLow32 (value); ++ timeout = min(timeout, XSyncValueLow32 (value)); ++ } else { ++ for (list = IdleTimeCounter->pTriglist; list; list = list->next) { ++ trig = list->pTrigger; ++ if (trig->CheckTrigger(trig, old_idle)) { ++ timeout = min(timeout, 0); ++ break; ++ } ++ } + } + + AdjustWaitForDelay (wt, timeout); + } ++ ++ IdleTimeCounter->value = old_idle; /* pop */ + } + + static void |