From 9aa60dfdf5b4837b9ceb15d8fcbc96f37dce7b5a Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Fri, 11 Dec 2009 15:19:30 +0100 Subject: 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 --- src/corelib/kernel/qcore_unix.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/corelib/kernel/qcore_unix.cpp b/src/corelib/kernel/qcore_unix.cpp index 5885591..d0dc7be 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; } } -- cgit v0.12