diff options
author | Thiago Macieira <thiago.macieira@nokia.com> | 2009-12-11 15:19:30 +0100 |
---|---|---|
committer | Thiago Macieira <thiago.macieira@nokia.com> | 2009-12-11 15:28:41 +0100 |
commit | 9aa60dfdf5b4837b9ceb15d8fcbc96f37dce7b5a (patch) | |
tree | 28abb71b4b696c485198e618abd0dca49dab536b /src/corelib | |
parent | 05ba6bad6c0927d22ccf026446dfdb9d85b3f03e (diff) | |
download | qt4-tools-9aa60dfdf5b4837b9ceb15d8fcbc96f37dce7b5a.tar.gz |
Check if the timeout expired during the time update in qt_safe_select
It can happen that select(2) returns -1 with EINTR, but the time
remaining was too small for us to update the time. Our own processing
(plus the syscall to clock_gettime(2)) leads us past the timeout, so
we get a negative timeval.
Task-number: QTBUG-6755
Reviewed-by: Bradley T. Hughes
Diffstat (limited to 'src/corelib')
-rw-r--r-- | src/corelib/kernel/qcore_unix.cpp | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/src/corelib/kernel/qcore_unix.cpp b/src/corelib/kernel/qcore_unix.cpp index 58855914a3..d0dc7be581 100644 --- a/src/corelib/kernel/qcore_unix.cpp +++ b/src/corelib/kernel/qcore_unix.cpp @@ -129,7 +129,7 @@ static inline bool time_update(struct timeval *tv, const struct timeval &start, // clock source is monotonic, so we can recalculate how much timeout is left struct timeval now = qt_gettime(); *tv = timeout + start - now; - return true; + return tv->tv_sec >= 0; } int qt_safe_select(int nfds, fd_set *fdread, fd_set *fdwrite, fd_set *fdexcept, @@ -154,7 +154,8 @@ int qt_safe_select(int nfds, fd_set *fdread, fd_set *fdwrite, fd_set *fdexcept, // recalculate the timeout if (!time_update(&timeout, start, *orig_timeout)) { - // clock reset, fake timeout error + // timeout during update + // or clock reset, fake timeout error return 0; } } |