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:
Bradley T. Hughes 2011-11-09 16:19:11 +01:00 committed by Qt by Nokia
parent 9c9bbfc13c
commit fb01907050
2 changed files with 5 additions and 9 deletions

View File

@ -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;
}

View File

@ -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);
}
/*