summaryrefslogtreecommitdiff
path: root/Xext
diff options
context:
space:
mode:
authorMark Kettenis <kettenis@openbsd.org>2013-12-15 14:31:10 +0100
committerMatthieu Herrb <matthieu.herrb@laas.fr>2014-02-09 10:41:18 +0100
commitddeca927498c9df3b5e62c7bf05e31e2a3aeaa52 (patch)
tree6a9b9e5dcd5bc14d5707bbb9428f6619d32f47af /Xext
parentae796d43c934ba378c9a618adc81c6729a14b2f8 (diff)
sync: Avoid ridiculously long timeouts
On OpenBSD, passing a timeout longer than 100000000 seconds to select(2) will make it fail with EINVAL. As this is original 4.4BSD behaviour it is not inconceivable that other systems suffer from the same problem. And Linux, though not suffering from any 4.4BSD heritage, briefly did something similar: <https://lkml.org/lkml/2012/8/31/263> So avoid calling AdjustWaitForDelay() instead of setting the timeout to (effectively) ULONG_MAX milliseconds. Signed-off-by: Mark Kettenis <kettenis@openbsd.org> Reviewed-by: Matthieu Herrb <matthieu@herrb.eu>
Diffstat (limited to 'Xext')
-rw-r--r--Xext/sync.c7
1 files changed, 2 insertions, 5 deletions
diff --git a/Xext/sync.c b/Xext/sync.c
index 97c9d5183..755ed94a1 100644
--- a/Xext/sync.c
+++ b/Xext/sync.c
@@ -2731,27 +2731,24 @@ IdleTimeBlockHandler(void *pCounter, struct timeval **wt, void *LastSelectMask)
* 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, *greater)) {
XSyncValue value;
Bool overflow;
XSyncValueSubtract(&value, *greater, idle, &overflow);
- timeout = min(timeout, XSyncValueLow32(value));
+ AdjustWaitForDelay(wt, XSyncValueLow32(value));
}
else {
for (list = counter->sync.pTriglist; list;
list = list->next) {
trig = list->pTrigger;
if (trig->CheckTrigger(trig, old_idle)) {
- timeout = min(timeout, 0);
+ AdjustWaitForDelay(wt, 0);
break;
}
}
}
-
- AdjustWaitForDelay(wt, timeout);
}
counter->value = old_idle; /* pop */