summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRafael Roquetto <rafael.roquetto.qnx@kdab.com>2012-07-04 17:23:03 +0200
committerQt by Nokia <qt-info@nokia.com>2012-07-05 13:13:58 +0200
commit40bfbf3a5b765d939a7eea999c49da5b16456ad1 (patch)
tree89bbbf5c037c08623f15f90e7f895137ab4a80ad /src
parent87fbe79af2ecde090880d145a1ea9d66418ac734 (diff)
Fix event loop throughput issue
Currently, only one bps event can be handled per event loop iteration, bringing about a huge performance penalty. This patch fixes this issue by bulk processing events whenever they are available. Change-Id: Iecce1e86730bd90c3c81a7c6ebdf9ed83189e58e Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com> Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src')
-rw-r--r--src/corelib/kernel/qeventdispatcher_blackberry.cpp33
1 files changed, 25 insertions, 8 deletions
diff --git a/src/corelib/kernel/qeventdispatcher_blackberry.cpp b/src/corelib/kernel/qeventdispatcher_blackberry.cpp
index 89bfa2df37..4b29613d88 100644
--- a/src/corelib/kernel/qeventdispatcher_blackberry.cpp
+++ b/src/corelib/kernel/qeventdispatcher_blackberry.cpp
@@ -42,6 +42,7 @@
#include "qeventdispatcher_blackberry_p.h"
#include "qsocketnotifier.h"
#include "qdebug.h"
+#include "qelapsedtimer.h"
#include <bps/bps.h>
#include <bps/event.h>
@@ -265,15 +266,31 @@ int QEventDispatcherBlackberry::select(int nfds, fd_set *readfds, fd_set *writef
if (timeout)
timeout_ms = (timeout->tv_sec * 1000) + (timeout->tv_usec / 1000);
- // wait for event or file to be ready
- bps_event_t *event = NULL;
- result = bps_get_event(&event, timeout_ms);
- if (result != BPS_SUCCESS)
- qWarning("QEventDispatcherBlackberry::select: bps_get_event() failed");
+ QElapsedTimer timer;
+ timer.start();
+
+ do {
+ // wait for event or file to be ready
+ bps_event_t *event = NULL;
+
+ // \TODO Remove this when bps is fixed
+ // BPS has problems respecting timeouts.
+ // Replace the bps_get_event statement
+ // with the following commented version
+ // once bps is fixed.
+ // result = bps_get_event(&event, timeout_ms);
+ result = bps_get_event(&event, 0);
+
+ if (result != BPS_SUCCESS)
+ qWarning("QEventDispatcherBlackberry::select: bps_get_event() failed");
+
+ if (!event)
+ break;
- // pass all received events through filter - except IO ready events
- if (event && bps_event_get_domain(event) != bpsIOReadyDomain)
- filterEvent((void*)event);
+ // pass all received events through filter - except IO ready events
+ if (event && bps_event_get_domain(event) != bpsIOReadyDomain)
+ filterEvent((void*)event);
+ } while (timer.elapsed() < timeout_ms);
// \TODO Remove this when bps is fixed (see comment above)
result = bps_remove_fd(d->thread_pipe[0]);