Correctly normalize timevals before calling select()
When normalizing timevals, we need to bound the tv_usec member to 0-999999 inclusive, otherwise select() may return EINVAL. When rounding timevals to the nearest millisecond in the UNIX event dispatcher, pass the timeval through normalizeTimeval() when returning. As discovered on Mac OS X with tst_QFutureWatcher, starting a 10 second timer would end up calling select() with timeval = { 9l, 1000000 }, resulting in numerous "select: Invalid argument" warnings being printed to the console. Change-Id: Ic539e935bf847e0d4c22a73ad203e3a7a81d0690 Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
This commit is contained in:
parent
9c9bbfc13c
commit
fb01907050
@ -101,13 +101,13 @@ QT_BEGIN_NAMESPACE
|
||||
// Internal operator functions for timevals
|
||||
inline timeval &normalizedTimeval(timeval &t)
|
||||
{
|
||||
while (t.tv_usec > 1000000l) {
|
||||
while (t.tv_usec >= 1000000) {
|
||||
++t.tv_sec;
|
||||
t.tv_usec -= 1000000l;
|
||||
t.tv_usec -= 1000000;
|
||||
}
|
||||
while (t.tv_usec < 0l) {
|
||||
while (t.tv_usec < 0) {
|
||||
--t.tv_sec;
|
||||
t.tv_usec += 1000000l;
|
||||
t.tv_usec += 1000000;
|
||||
}
|
||||
return t;
|
||||
}
|
||||
|
@ -448,11 +448,7 @@ static timeval roundToMillisecond(timeval val)
|
||||
|
||||
int us = val.tv_usec % 1000;
|
||||
val.tv_usec += 1000 - us;
|
||||
if (val.tv_usec > 1000000) {
|
||||
val.tv_usec -= 1000000;
|
||||
++val.tv_sec;
|
||||
}
|
||||
return val;
|
||||
return normalizedTimeval(val);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user