From 7c99fed1373829835d926081c43a5426bc4d2cb6 Mon Sep 17 00:00:00 2001 From: Thomas McGuire Date: Mon, 15 Oct 2012 14:21:21 +0200 Subject: Blackberry: Emit aboutToBlock() and awake() correctly in the dispatcher On Blackberry, select() can actually temporarily wake up to process mative BPS events. Make sure to emit the aboutToBlock() and awake() signals in this situation accordingly. This is a backport of qtbase commit a1082dbc3f61f1747bd756f8fce2a54f558793ed Change-Id: If1bd1c300b037cb5dac1c96c68abbfb22188dd34 Reviewed-by: Kevin Krammer Reviewed-by: Sean Harmer Reviewed-by: Rafael Roquetto --- src/corelib/kernel/qeventdispatcher_blackberry.cpp | 38 ++++++++++++++++++---- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/src/corelib/kernel/qeventdispatcher_blackberry.cpp b/src/corelib/kernel/qeventdispatcher_blackberry.cpp index 5711903..3c00e91 100644 --- a/src/corelib/kernel/qeventdispatcher_blackberry.cpp +++ b/src/corelib/kernel/qeventdispatcher_blackberry.cpp @@ -296,14 +296,35 @@ int QEventDispatcherBlackberry::select(int nfds, fd_set *readfds, fd_set *writef if (timeout) timeout_bps = (timeout->tv_sec * 1000) + (timeout->tv_usec / 1000); + bool hasProcessedEventsOnce = false; + bps_event_t *event = 0; + // 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 // is important for handling touch events which can come in rapidly. forever { + Q_ASSERT(!hasProcessedEventsOnce || event); + + // Only emit the awake() and aboutToBlock() signals in the second iteration. For the first + // iteration, the UNIX event dispatcher will have taken care of that already. + if (hasProcessedEventsOnce) + emit awake(); + + // Filtering the native event should happen between the awake() and aboutToBlock() signal + // emissions. The calls awake() - filterNativeEvent() - aboutToBlock() - bps_get_event() + // need not to be interrupted by a break or return statement. + // + // Because of this, the native event is actually processed one loop iteration + // after it was retrieved with bps_get_event(). + if (event) + filterEvent((void*)event); + + if (hasProcessedEventsOnce) + emit aboutToBlock(); + // Wait for event or file to be ready - bps_event_t *event = NULL; + event = 0; const int result = bps_get_event(&event, timeout_bps); - if (result != BPS_SUCCESS) qWarning("QEventDispatcherBlackberry::select: bps_get_event() failed"); @@ -315,16 +336,19 @@ int QEventDispatcherBlackberry::select(int nfds, fd_set *readfds, fd_set *writef if (!event || bps_event_get_domain(event) == bpsIOReadyDomain) break; - // Any other events must be bps native events so we pass all such received - // events through the native event filter chain - filterEvent((void*)event); - // Update the timeout. If this fails we have exceeded our alloted time or the system // clock has changed time and we cannot calculate a new timeout so we bail out. - if (!updateTimeout(&timeout_bps, startTime)) + if (!updateTimeout(&timeout_bps, startTime)) { + + // No more loop iteration, so we need to filter the event here. + filterEvent((void*)event); break; + } + + hasProcessedEventsOnce = true; } + // the number of bits set in the file sets return d->ioData->count; } -- cgit v0.12