diff options
author | Fabian Bumberger <fbumberger@rim.com> | 2014-01-17 20:45:57 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-01-28 19:32:53 +0100 |
commit | b8103a4e8174446584caf80c0bf1a006b25d9905 (patch) | |
tree | 465a99e8d15a6037e48dccbb7a7aba5530b332ea /src/plugins/platforms/qnx/qqnxscreeneventthread.cpp | |
parent | a4ff400e25c76a32ec8252285dda043f07b19c15 (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.cpp | 50 |
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); |