summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/kernel/qeventdispatcher_blackberry.cpp33
1 files changed, 22 insertions, 11 deletions
diff --git a/src/corelib/kernel/qeventdispatcher_blackberry.cpp b/src/corelib/kernel/qeventdispatcher_blackberry.cpp
index 0a8b0a6..394fde4 100644
--- a/src/corelib/kernel/qeventdispatcher_blackberry.cpp
+++ b/src/corelib/kernel/qeventdispatcher_blackberry.cpp
@@ -132,7 +132,7 @@ static int bpsIOHandler(int fd, int io_events, void *data)
}
// post unblock event to our thread; in this callback the bps channel is
- // guarenteed to be the same that was active when bps_add_fd was called
+ // guaranteed to be the same that was active when bps_add_fd was called
result = bps_push_event(event);
if (result != BPS_SUCCESS) {
qWarning("QEventDispatcherBlackberryPrivate::QEventDispatcherBlackberry: bps_push_event() failed");
@@ -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