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>
This commit is contained in:
parent
24d8bcf93a
commit
9cfce43f19
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user