diff options
author | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2011-03-03 13:33:04 (GMT) |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2011-03-03 13:57:00 (GMT) |
commit | 25723504d1fc917671dbdeadf441c2ca12145297 (patch) | |
tree | 44ef12570b24a9eaac1a8fff21a6c66b765b487b /src/corelib/io | |
parent | 65dac2b78c38803f418b331015c801247321dd1b (diff) | |
download | Qt-25723504d1fc917671dbdeadf441c2ca12145297.zip Qt-25723504d1fc917671dbdeadf441c2ca12145297.tar.gz Qt-25723504d1fc917671dbdeadf441c2ca12145297.tar.bz2 |
Fix QProcess::waitForFinished WaitForRequest handling in Symbian
Waiting for both logonStatus and timerStatus after one has already
completed normally could potentially return because some unrelated
request completed in the meantime, swallowing the wrong signal.
Task-number: QT-4659
Reviewed-by: Janne Koskinen
Diffstat (limited to 'src/corelib/io')
-rw-r--r-- | src/corelib/io/qprocess_symbian.cpp | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/src/corelib/io/qprocess_symbian.cpp b/src/corelib/io/qprocess_symbian.cpp index d22d1ed..8a74c7b 100644 --- a/src/corelib/io/qprocess_symbian.cpp +++ b/src/corelib/io/qprocess_symbian.cpp @@ -961,16 +961,15 @@ bool QProcessPrivate::waitForFinished(int msecs) User::WaitForRequest(logonStatus, timerStatus); QPROCESS_DEBUG_PRINT("QProcessPrivate::waitForFinished() - Wait completed"); - if (timerStatus == KErrNone) + if (logonStatus != KRequestPending) { + timer.Cancel(); + User::WaitForRequest(timerStatus); + } else { timeoutOccurred = true; - - timer.Cancel(); + symbianProcess->LogonCancel(logonStatus); + User::WaitForRequest(logonStatus); + } timer.Close(); - - symbianProcess->LogonCancel(logonStatus); - - // Eat cancel request completion so that it won't mess up main thread scheduling later - User::WaitForRequest(logonStatus, timerStatus); } } else { QPROCESS_DEBUG_PRINT("QProcessPrivate::waitForFinished(), qt_rprocess_running returned false"); |