File labtool_dfu-util_wait.patch of Package labtool
From cb0ec95b3687434e1531cfc6818d75a922d041fe Mon Sep 17 00:00:00 2001
From: Scott Tsai <scottt.tw@gmail.com>
Date: Sun, 14 Sep 2014 06:06:26 +0800
Subject: [PATCH 3/3] LabToolDeviceCommThread: call WaitForStarted() in
runDFU()
From the QProcess state machine design it's more correct to call ::WaitForStarted() and not call ::WaitForFinished() if the former fails.
This patch also make "DFUProcess" a local variable instead of a pointer to heap allocate object to make forgoetting to call delete on error paths impossible.
---
app/device/labtool/labtooldevicecommthread.cpp | 29 +++++++++++++++-----------
1 file changed, 17 insertions(+), 12 deletions(-)
diff --git a/app/device/labtool/labtooldevicecommthread.cpp b/app/device/labtool/labtooldevicecommthread.cpp
index 0f0eca8..3ae7952 100644
--- a/app/device/labtool/labtooldevicecommthread.cpp
+++ b/app/device/labtool/labtooldevicecommthread.cpp
@@ -235,40 +235,45 @@ void LabToolDeviceCommThread::runDFU()
QStringList arguments;
arguments << "-R" << "-d 1fc9:000c" << "-D" << mPreparedImage;
- //mDFUProcess->setWorkingDirectory("../tools/dfu-util-0.7-binaries/win32-mingw32/");
- QProcess* m_DFUProcess = new QProcess();
- m_DFUProcess->start(program, arguments);
- if (m_DFUProcess->waitForFinished())
+ QProcess DFUProcess;
+ // DFUProcess.setWorkingDirectory("../tools/dfu-util-0.7-binaries/win32-mingw32/");
+ DFUProcess.start(program, arguments);
+ if (!DFUProcess.waitForStarted())
+ {
+ qDebug() << "DFU program \"" << program << "\" failed to start";
+ return;
+ }
+
+ if (DFUProcess.waitForFinished())
{
// qDebug("DFU program finished");
-// switch(m_DFUProcess->exitStatus()) {
+// switch(DFUProcess.exitStatus()) {
// case QProcess::NormalExit: qDebug("exitStatus() = QProcess::NormalExit"); break;
// case QProcess::CrashExit: qDebug("exitStatus() = QProcess::CrashExit"); break;
-// default: qDebug("exitStatus() = unknown code %d", m_DFUProcess->exitStatus()); break;
+// default: qDebug("exitStatus() = unknown code %d", DFUProcess.exitStatus()); break;
// }
-// switch(m_DFUProcess->error()) {
+// switch(DFUProcess.error()) {
// case QProcess::FailedToStart: qDebug("error() = QProcess::FailedToStart"); break;
// case QProcess::Crashed: qDebug("error() = QProcess::Crashed"); break;
// case QProcess::Timedout: qDebug("error() = QProcess::Timedout"); break;
// case QProcess::WriteError: qDebug("error() = QProcess::WriteError"); break;
// case QProcess::ReadError: qDebug("error() = QProcess::ReadError"); break;
// case QProcess::UnknownError: qDebug("error() = QProcess::UnknownError"); break;
-// default: qDebug("error() = unknown code %d", m_DFUProcess->error()); break;
+// default: qDebug("error() = unknown code %d", DFUProcess.error()); break;
// }
-// qDebug("exitCode() = %d", m_DFUProcess->exitCode());
+// qDebug("exitCode() = %d", DFUProcess.exitCode());
-// qDebug("readAllStandardError(): -->%s<--", m_DFUProcess->readAllStandardError().constData());
-// qDebug("readAllStandardOutput(): -->%s<--", m_DFUProcess->readAllStandardOutput().constData());
+// qDebug("readAllStandardError(): -->%s<--", DFUProcess.readAllStandardError().constData());
+// qDebug("readAllStandardOutput(): -->%s<--", DFUProcess.readAllStandardOutput().constData());
}
else
{
qDebug("DFU program timed out waiting to finish");
}
- delete m_DFUProcess;
}
/*!
--
2.1.4