diff options
author | Eike Ziller <eike.ziller@digia.com> | 2013-10-08 15:27:45 +0200 |
---|---|---|
committer | Eike Ziller <eike.ziller@digia.com> | 2013-10-08 15:42:19 +0200 |
commit | 171fd691c397dcbd03e7d5bb2cb3d3b4845158a9 (patch) | |
tree | 9cc620d51a2c93aa47d95b0fbf3e7d6541ea3382 /src/plugins/ios/iostoolhandler.cpp | |
parent | c65c650cc2dcb0ac336cb2f6e74cb2e327e8ba15 (diff) | |
download | qt-creator-171fd691c397dcbd03e7d5bb2cb3d3b4845158a9.tar.gz |
Ios: Fix crash when connecting user-mode device
The modal dialog was opened directly from the tool output processing,
and when returning the tool handler was already deleted.
Change-Id: Iacba584b59bf8720788ac03fd2e839c5e4485ab3
Reviewed-by: Fawzi Mohamed <fawzi.mohamed@digia.com>
Diffstat (limited to 'src/plugins/ios/iostoolhandler.cpp')
-rw-r--r-- | src/plugins/ios/iostoolhandler.cpp | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/src/plugins/ios/iostoolhandler.cpp b/src/plugins/ios/iostoolhandler.cpp index c3643c9e37..bc784aea74 100644 --- a/src/plugins/ios/iostoolhandler.cpp +++ b/src/plugins/ios/iostoolhandler.cpp @@ -61,7 +61,7 @@ class MyProcess: public QProcess Q_OBJECT public: explicit MyProcess(QObject *parent = 0); - int processOutput(); + int processOutputSocket(); QSocketNotifier *notifier(); protected: virtual void setupChildProcess(); @@ -136,6 +136,7 @@ public: }; explicit IosToolHandlerPrivate(IosToolHandler::DeviceType devType, IosToolHandler *q); + virtual ~IosToolHandlerPrivate() {} virtual void requestTransferApp(const QString &bundlePath, const QString &deviceId, int timeout = 1000) = 0; virtual void requestRunApp(const QString &bundlePath, const QStringList &extraArgs, @@ -221,7 +222,7 @@ MyProcess::MyProcess(QObject *parent) : QProcess(parent) m_notifier = new QSocketNotifier(m_sockets[0], QSocketNotifier::Read, this); } -int MyProcess::processOutput() +int MyProcess::processOutputSocket() { return m_sockets[0]; } @@ -251,8 +252,8 @@ IosToolHandlerPrivate::IosToolHandlerPrivate(IosToolHandler::DeviceType devType, q, SLOT(subprocessFinished(int,QProcess::ExitStatus))); QObject::connect(&process, SIGNAL(error(QProcess::ProcessError)), q, SLOT(subprocessError(QProcess::ProcessError))); - int accessFlags = fcntl(process.processOutput(), F_GETFL); - if (fcntl(process.processOutput(), F_SETFL, accessFlags | O_NONBLOCK) == -1) + int accessFlags = fcntl(process.processOutputSocket(), F_GETFL); + if (fcntl(process.processOutputSocket(), F_SETFL, accessFlags | O_NONBLOCK) == -1) qDebug() << "IosToolHandler fcntl F_SETFL failed to set non blocking mode" << qt_error_string(errno); } @@ -277,9 +278,11 @@ void IosToolHandlerPrivate::stop() if (debugToolHandler) qDebug() << "IosToolHandlerPrivate::stop"; if (process.state() != QProcess::NotRunning) { - close(process.processOutput()); + close(process.processOutputSocket()); process.close(); process.kill(); + if (debugToolHandler) + qDebug() << "killing"; } if (state != Stopped) { state = Stopped; @@ -374,7 +377,7 @@ void IosToolHandlerPrivate::subprocessError(QProcess::ProcessError error) void IosToolHandlerPrivate::subprocessFinished(int exitCode, QProcess::ExitStatus exitStatus) { // process potentially pending data - subprocessHasData(process.processOutput()); + subprocessHasData(process.processOutputSocket()); switch (state) { case NonStarted: qDebug() << "subprocessFinished() when state was NonStarted"; @@ -944,6 +947,11 @@ IosToolHandler::IosToolHandler(DeviceType devType, QObject *parent) : d = new Internal::IosSimulatorToolHandlerPrivate(devType, this); } +IosToolHandler::~IosToolHandler() +{ + delete d; +} + void IosToolHandler::stop() { d->stop(); |