From ef7a5836be742b40a3af8f8f71fc8b7e595142cc Mon Sep 17 00:00:00 2001
From: Fawzi Mohamed <fawzi.mohamed@digia.com>
Date: Fri, 14 Feb 2014 01:05:59 +0100
Subject: [PATCH] ios: explicitly stop an application when running on the same
 device

iOS devices can run an application at a time.

Change-Id: I85a24ff32fbee571830a4bc4be8b18259f87924a
Reviewed-by: Daniel Teske <daniel.teske@digia.com>
---
 src/plugins/ios/iosrunfactories.cpp | 17 ++++++++++++++---
 src/plugins/ios/iosrunfactories.h   |  2 ++
 2 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/src/plugins/ios/iosrunfactories.cpp b/src/plugins/ios/iosrunfactories.cpp
index b7c78e87983..760d26d13dc 100644
--- a/src/plugins/ios/iosrunfactories.cpp
+++ b/src/plugins/ios/iosrunfactories.cpp
@@ -37,6 +37,7 @@
 
 #include <projectexplorer/project.h>
 #include <projectexplorer/projectexplorerconstants.h>
+#include <projectexplorer/projectexplorer.h>
 #include <projectexplorer/target.h>
 #include <debugger/debuggerconstants.h>
 #include <qmakeprojectmanager/qmakeproject.h>
@@ -46,7 +47,6 @@
 #include <qtsupport/qtsupportconstants.h>
 #include <coreplugin/id.h>
 
-
 using namespace ProjectExplorer;
 using namespace QmakeProjectManager;
 
@@ -166,10 +166,21 @@ RunControl *IosRunControlFactory::create(RunConfiguration *runConfig,
     Q_ASSERT(canRun(runConfig, mode));
     IosRunConfiguration *rc = qobject_cast<IosRunConfiguration *>(runConfig);
     Q_ASSERT(rc);
+    RunControl *res = 0;
+    Core::Id devId = ProjectExplorer::DeviceKitInformation::deviceId(rc->target()->kit());
+    // The device can only run an application at a time, if an app is running stop it.
+    if (m_activeRunControls.contains(devId)) {
+        QPointer<ProjectExplorer::RunControl> activeRunControl = m_activeRunControls[devId];
+        activeRunControl->stop();
+        m_activeRunControls.remove(devId);
+    }
     if (mode == NormalRunMode)
-        return new Ios::Internal::IosRunControl(rc);
+        res = new Ios::Internal::IosRunControl(rc);
     else
-        return IosDebugSupport::createDebugRunControl(rc, errorMessage);
+        res = IosDebugSupport::createDebugRunControl(rc, errorMessage);
+    if (devId.isValid())
+        m_activeRunControls[devId] = res;
+    return res;
 }
 
 } // namespace Internal
diff --git a/src/plugins/ios/iosrunfactories.h b/src/plugins/ios/iosrunfactories.h
index 6f86be5f0a8..3d66090fd40 100644
--- a/src/plugins/ios/iosrunfactories.h
+++ b/src/plugins/ios/iosrunfactories.h
@@ -85,6 +85,8 @@ public:
     ProjectExplorer::RunControl *create(ProjectExplorer::RunConfiguration *runConfiguration,
                        ProjectExplorer::RunMode mode,
                        QString *errorMessage) QTC_OVERRIDE;
+private:
+    mutable QMap<Core::Id, QPointer<ProjectExplorer::RunControl> > m_activeRunControls;
 };
 
 } // namespace Internal
-- 
GitLab