summaryrefslogtreecommitdiffstats
path: root/src/corelib
diff options
context:
space:
mode:
authorThomas McGuire <thomas.mcguire.qnx@kdab.com>2012-10-15 12:21:21 (GMT)
committerThe Qt Project <gerrit-noreply@qt-project.org>2012-10-18 00:32:11 (GMT)
commit7c99fed1373829835d926081c43a5426bc4d2cb6 (patch)
tree58cdf525d1b9027be341386bea053d3791b6a417 /src/corelib
parent097af16558e75a961f322b60824506c11491ef63 (diff)
downloadQt-7c99fed1373829835d926081c43a5426bc4d2cb6.zip
Qt-7c99fed1373829835d926081c43a5426bc4d2cb6.tar.gz
Qt-7c99fed1373829835d926081c43a5426bc4d2cb6.tar.bz2
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 <kevin.krammer@kdab.com> Reviewed-by: Sean Harmer <sean.harmer@kdab.com> Reviewed-by: Rafael Roquetto <rafael.roquetto@kdab.com>
Diffstat (limited to 'src/corelib')
-rw-r--r--src/corelib/kernel/qeventdispatcher_blackberry.cpp38
1 files 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;
}