diff options
author | Liang Jian <jianliang79@gmail.com> | 2015-03-03 17:16:16 +0800 |
---|---|---|
committer | jian liang <jianliang79@gmail.com> | 2015-03-05 10:09:50 +0000 |
commit | 8c0ef140b3a7202c03f223b692b31206aaf9d8b8 (patch) | |
tree | cc03aac95427cd48a79e502102e4031682141dcf /src/plugins/platforms/android | |
parent | a9bb1c63dc12034ebac1dd9402c9719dca7a92e1 (diff) |
Avoid deadlock with two consecutive suspended notification
According to our Android app test, sometimes we will receive two
consecutive app suspended notifications. In the second app suspended
notification QWindowSystemInterface::flushWindowSystemEvents() will
deadlock due to the fact that the event dispatcher has been stopped in the
first app suspended notification. This patch will simply return if we
found the event dispatcher has been stopped in the beginning of app
suspended notification.
Change-Id: I15fa4a6a118510b866ff16061862f4bb8360cc9b
Reviewed-by: BogDan Vatra <bogdan@kde.org>
Diffstat (limited to 'src/plugins/platforms/android')
-rw-r--r-- | src/plugins/platforms/android/androidjnimain.cpp | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/src/plugins/platforms/android/androidjnimain.cpp b/src/plugins/platforms/android/androidjnimain.cpp index 1c157c79c3..00ef8f670a 100644 --- a/src/plugins/platforms/android/androidjnimain.cpp +++ b/src/plugins/platforms/android/androidjnimain.cpp @@ -593,6 +593,13 @@ static void updateApplicationState(JNIEnv */*env*/, jobject /*thiz*/, jint state return; if (state <= Qt::ApplicationInactive) { + // NOTE: sometimes we will receive two consecutive suspended notifications, + // In the second suspended notification, QWindowSystemInterface::flushWindowSystemEvents() + // will deadlock since the dispatcher has been stopped in the first suspended notification. + // To avoid the deadlock we simply return if we found the event dispatcher has been stopped. + if (QAndroidEventDispatcherStopper::instance()->stopped()) + return; + // Don't send timers and sockets events anymore if we are going to hide all windows QAndroidEventDispatcherStopper::instance()->goingToStop(true); QCoreApplication::processEvents(); |