summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/qnx/qqnxscreeneventthread.cpp
diff options
context:
space:
mode:
authorFabian Bumberger <fbumberger@rim.com>2014-01-17 20:45:57 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-01-28 19:32:53 +0100
commitb8103a4e8174446584caf80c0bf1a006b25d9905 (patch)
tree465a99e8d15a6037e48dccbb7a7aba5530b332ea /src/plugins/platforms/qnx/qqnxscreeneventthread.cpp
parenta4ff400e25c76a32ec8252285dda043f07b19c15 (diff)
[QNX] Introduce proper screen error handling
This patch adds a new function which does the error handling for libscreen calls. The patch introduces following changes: - Libscreen errors will not crash (qFatal)the application any more but rather post a warning message. -With the "flush-screen-context" option the screen_context is always flushed when a screen function is called. This enables better correlation between the time an error happens and the time it is logged. Change-Id: Ie2456e5b746dcf917d786f3b832847d2ebbe5f1e Reviewed-by: Kevin Krammer <kevin.krammer@kdab.com> Reviewed-by: Roger Maclean <rmaclean@qnx.com> Reviewed-by: Bernd Weimer <bweimer@blackberry.com> Reviewed-by: Rafael Roquetto <rafael.roquetto@kdab.com>
Diffstat (limited to 'src/plugins/platforms/qnx/qqnxscreeneventthread.cpp')
-rw-r--r--src/plugins/platforms/qnx/qqnxscreeneventthread.cpp50
1 files changed, 25 insertions, 25 deletions
diff --git a/src/plugins/platforms/qnx/qqnxscreeneventthread.cpp b/src/plugins/platforms/qnx/qqnxscreeneventthread.cpp
index 25a597bab9..156ba8a780 100644
--- a/src/plugins/platforms/qnx/qqnxscreeneventthread.cpp
+++ b/src/plugins/platforms/qnx/qqnxscreeneventthread.cpp
@@ -39,6 +39,8 @@
**
****************************************************************************/
+#include "qqnxglobal.h"
+
#include "qqnxscreeneventthread.h"
#include "qqnxscreeneventhandler.h"
@@ -92,30 +94,34 @@ void QQnxScreenEventThread::run()
{
qScreenEventThreadDebug() << Q_FUNC_INFO << "screen event thread started";
+ int errorCounter = 0;
// loop indefinitely
while (!m_quit) {
screen_event_t event;
// create screen event
- errno = 0;
- int result = screen_create_event(&event);
- if (result)
- qFatal("QQNX: failed to create screen event, errno=%d", errno);
-
+ Q_SCREEN_CHECKERROR(screen_create_event(&event), "Failed to create screen event");
// block until screen event is available
- errno = 0;
- result = screen_get_event(m_screenContext, event, -1);
- if (result)
- qFatal("QQNX: failed to get screen event, errno=%d", errno);
+ const int result = screen_get_event(m_screenContext, event, -1);
+ Q_SCREEN_CRITICALERROR(result, "Failed to get screen event");
+ // Only allow 50 consecutive errors before we exit the thread
+ if (!result) {
+ errorCounter++;
+ if (errorCounter > 50)
+ m_quit = true;
+
+ screen_destroy_event(event);
+ continue;
+ } else {
+ errorCounter = 0;
+ }
// process received event
// get the event type
- errno = 0;
int qnxType;
- result = screen_get_event_property_iv(event, SCREEN_PROPERTY_TYPE, &qnxType);
- if (result)
- qFatal("QQNX: failed to query screen event type, errno=%d", errno);
+ Q_SCREEN_CHECKERROR(screen_get_event_property_iv(event, SCREEN_PROPERTY_TYPE, &qnxType),
+ "Failed to query screen event type");
if (qnxType == SCREEN_EVENT_USER) {
// treat all user events as shutdown requests
@@ -145,25 +151,19 @@ void QQnxScreenEventThread::shutdown()
screen_event_t event;
// create screen event
- errno = 0;
- int result = screen_create_event(&event);
- if (result)
- qFatal("QQNX: failed to create screen event, errno=%d", errno);
+ Q_SCREEN_CHECKERROR(screen_create_event(&event),
+ "Failed to create screen event");
// set the event type as user
- errno = 0;
int type = SCREEN_EVENT_USER;
- result = screen_set_event_property_iv(event, SCREEN_PROPERTY_TYPE, &type);
- if (result)
- qFatal("QQNX: failed to set screen event type, errno=%d", errno);
+ Q_SCREEN_CHECKERROR(screen_set_event_property_iv(event, SCREEN_PROPERTY_TYPE, &type),
+ "Failed to set screen type");
// NOTE: ignore SCREEN_PROPERTY_USER_DATA; treat all user events as shutdown events
// post event to event loop so it will wake up and die
- errno = 0;
- result = screen_send_event(m_screenContext, event, getpid());
- if (result)
- qFatal("QQNX: failed to set screen event type, errno=%d", errno);
+ Q_SCREEN_CHECKERROR(screen_send_event(m_screenContext, event, getpid()),
+ "Failed to set screen event type");
// cleanup
screen_destroy_event(event);