summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel
diff options
context:
space:
mode:
authorBernd Weimer <bweimer@rim.com>2013-01-03 14:47:51 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-01-04 10:27:09 +0100
commit9cfce43f19af87bc0a929b917da2901de7dbc193 (patch)
treeeacc4c6ca1971163751ff235975983322608f74b /src/corelib/kernel
parent24d8bcf93a14545769154dae9ce06de2ef4c2430 (diff)
BlackBerry: Reevaluation of timer list in event dispatcher
In the event dispatcher the timer list has to be reevaluated after each call to filterEvent, because timers could be started in event filters. Change-Id: I1a275845fb74c63441f2301555f3459f8295af27 Reviewed-by: Rafael Roquetto <rafael.roquetto@kdab.com> Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/corelib/kernel')
-rw-r--r--src/corelib/kernel/qeventdispatcher_blackberry.cpp31
1 files changed, 21 insertions, 10 deletions
diff --git a/src/corelib/kernel/qeventdispatcher_blackberry.cpp b/src/corelib/kernel/qeventdispatcher_blackberry.cpp
index 69b4a8b172..3e958ee277 100644
--- a/src/corelib/kernel/qeventdispatcher_blackberry.cpp
+++ b/src/corelib/kernel/qeventdispatcher_blackberry.cpp
@@ -271,6 +271,11 @@ void QEventDispatcherBlackberry::unregisterSocketNotifier(QSocketNotifier *notif
}
}
+static inline int timevalToMillisecs(const timeval &tv)
+{
+ return (tv.tv_sec * 1000) + (tv.tv_usec / 1000);
+}
+
int QEventDispatcherBlackberry::select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
timeval *timeout)
{
@@ -279,9 +284,6 @@ int QEventDispatcherBlackberry::select(int nfds, fd_set *readfds, fd_set *writef
BpsChannelScopeSwitcher channelSwitcher(d->bps_channel);
- // Make a note of the start time
- timeval startTime = qt_gettime();
-
// prepare file sets for bps callback
d->ioData->count = 0;
d->ioData->readfds = readfds;
@@ -298,15 +300,15 @@ int QEventDispatcherBlackberry::select(int nfds, fd_set *readfds, fd_set *writef
if (exceptfds)
FD_ZERO(exceptfds);
+ bps_event_t *event = 0;
+ unsigned int eventCount = 0;
+
// Convert timeout to milliseconds
int timeoutTotal = -1;
if (timeout)
- timeoutTotal = (timeout->tv_sec * 1000) + (timeout->tv_usec / 1000);
-
+ timeoutTotal = timevalToMillisecs(*timeout);
int timeoutLeft = timeoutTotal;
-
- bps_event_t *event = 0;
- unsigned int eventCount = 0;
+ timeval startTime = qt_gettime();
// This loop exists such that we can drain the bps event queue of all native events
// more efficiently than if we were to return control to Qt after each event. This
@@ -331,11 +333,20 @@ int QEventDispatcherBlackberry::select(int nfds, fd_set *readfds, fd_set *writef
// Clock source is monotonic, so we can recalculate how much timeout is left
if (timeoutTotal != -1) {
timeval t2 = qt_gettime();
- timeoutLeft = timeoutTotal - ((t2.tv_sec * 1000 + t2.tv_usec / 1000)
- - (startTime.tv_sec * 1000 + startTime.tv_usec / 1000));
+ timeoutLeft = timeoutTotal
+ - (timevalToMillisecs(t2) - timevalToMillisecs(startTime));
if (timeoutLeft < 0)
timeoutLeft = 0;
}
+
+ timeval tnext;
+ if (d->timerList.timerWait(tnext)) {
+ int timeoutNext = timevalToMillisecs(tnext);
+ if (timeoutNext < timeoutLeft || timeoutTotal == -1) {
+ timeoutTotal = timeoutLeft = timeoutNext;
+ startTime = qt_gettime();
+ }
+ }
}
// Wait for event or file to be ready