aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorhjk <hjk@qt.io>2018-05-11 12:11:51 +0200
committerhjk <hjk@qt.io>2018-05-17 07:05:59 +0000
commit8580e32e88402cb9c243b1956f159c730c9520f8 (patch)
treec1bb45ee3fc8603d33be8e473691608a54327915 /src
parent69d45b7371abd8b81fad06ede9485f243f4a0b92 (diff)
ProjectExplorer: Start transferring RunWorkerFactory ownership
... to the plugins providing them. To allow this being done one-by-one in the plugins, allow both central and per-plugin ownership, and clean up the central instances centrally. This step will be removed again once the transition is complete. Change-Id: Ica7786012e05ab83a0784448f2f8b3b781fe2167 Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/plugins/projectexplorer/projectexplorer.cpp2
-rw-r--r--src/plugins/projectexplorer/runconfiguration.cpp29
-rw-r--r--src/plugins/projectexplorer/runconfiguration.h14
3 files changed, 26 insertions, 19 deletions
diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp
index ad5496e6e9..3ab8f328ac 100644
--- a/src/plugins/projectexplorer/projectexplorer.cpp
+++ b/src/plugins/projectexplorer/projectexplorer.cpp
@@ -524,6 +524,8 @@ ProjectExplorerPlugin::~ProjectExplorerPlugin()
delete dd->m_toolChainManager;
ProjectPanelFactory::destroyFactories();
delete dd;
+
+ RunWorkerFactory::destroyRemainingRunWorkerFactories();
}
ProjectExplorerPlugin *ProjectExplorerPlugin::instance()
diff --git a/src/plugins/projectexplorer/runconfiguration.cpp b/src/plugins/projectexplorer/runconfiguration.cpp
index ffa3011d99..292940f20e 100644
--- a/src/plugins/projectexplorer/runconfiguration.cpp
+++ b/src/plugins/projectexplorer/runconfiguration.cpp
@@ -683,17 +683,18 @@ FixedRunConfigurationFactory::availableCreators(Target *parent) const
// RunWorkerFactory
-using RunWorkerFactories = std::vector<RunWorkerFactory>;
+static QList<RunWorkerFactory *> g_runWorkerFactories;
-static RunWorkerFactories &theWorkerFactories()
+RunWorkerFactory::RunWorkerFactory(Core::Id mode, Constraint constr, const WorkerCreator &prod, int prio)
+ : m_runMode(mode), m_constraint(constr), m_producer(prod), m_priority(prio)
{
- static RunWorkerFactories factories;
- return factories;
+ g_runWorkerFactories.append(this);
}
-RunWorkerFactory::RunWorkerFactory(Core::Id mode, Constraint constr, const WorkerCreator &prod, int prio)
- : m_runMode(mode), m_constraint(constr), m_producer(prod), m_priority(prio)
-{}
+RunWorkerFactory::~RunWorkerFactory()
+{
+ g_runWorkerFactories.removeOne(this);
+}
bool RunWorkerFactory::canRun(RunConfiguration *runConfiguration, Core::Id runMode) const
{
@@ -704,7 +705,10 @@ bool RunWorkerFactory::canRun(RunConfiguration *runConfiguration, Core::Id runMo
return m_constraint(runConfiguration);
}
-
+void RunWorkerFactory::destroyRemainingRunWorkerFactories()
+{
+ qDeleteAll(g_runWorkerFactories);
+}
/*!
\class ProjectExplorer::RunControl
@@ -1003,7 +1007,7 @@ RunWorker *RunControl::createWorker(Core::Id id)
RunWorkerFactory::WorkerCreator RunControl::producer(RunConfiguration *runConfig, Core::Id runMode)
{
const auto canRun = std::bind(&RunWorkerFactory::canRun, std::placeholders::_1, runConfig, runMode);
- const RunWorkerFactories candidates = Utils::filtered(theWorkerFactories(), canRun);
+ const QList<RunWorkerFactory *> candidates = Utils::filtered(g_runWorkerFactories, canRun);
if (candidates.empty())
return {};
@@ -1013,12 +1017,7 @@ RunWorkerFactory::WorkerCreator RunControl::producer(RunConfiguration *runConfig
std::bind(&RunWorkerFactory::priority, std::placeholders::_2));
const auto bestFactory = std::max_element(candidates.begin(), candidates.end(), higherPriority);
- return bestFactory->producer();
-}
-
-void RunControl::addWorkerFactory(const RunWorkerFactory &workerFactory)
-{
- theWorkerFactories().push_back(workerFactory);
+ return (*bestFactory)->producer();
}
void RunControlPrivate::initiateStart()
diff --git a/src/plugins/projectexplorer/runconfiguration.h b/src/plugins/projectexplorer/runconfiguration.h
index a963f4fc80..81eba173b3 100644
--- a/src/plugins/projectexplorer/runconfiguration.h
+++ b/src/plugins/projectexplorer/runconfiguration.h
@@ -456,12 +456,19 @@ public:
RunWorkerFactory(Core::Id mode, Constraint constr, const WorkerCreator &prod,
int prio = 0);
+ virtual ~RunWorkerFactory();
+
bool canRun(RunConfiguration *runConfiguration, Core::Id m_runMode) const;
int priority() const { return m_priority; }
WorkerCreator producer() const { return m_producer; }
private:
+ // FIXME: That's temporary until ownership has been transferred to
+ // the individual plugins.
+ friend class ProjectExplorerPlugin;
+ static void destroyRemainingRunWorkerFactories();
+
Core::Id m_runMode;
Constraint m_constraint;
WorkerCreator m_producer;
@@ -539,20 +546,20 @@ public:
static void registerWorker(Core::Id runMode, const WorkerCreator &producer,
const Constraint &constraint = {})
{
- addWorkerFactory({runMode, constraint, producer});
+ (void) new RunWorkerFactory(runMode, constraint, producer);
}
template <class Worker>
static void registerWorker(Core::Id runMode, const Constraint &constraint, int priority = 0)
{
auto producer = [](RunControl *rc) { return new Worker(rc); };
- addWorkerFactory({runMode, constraint, producer, priority});
+ (void) new RunWorkerFactory(runMode, constraint, producer, priority);
}
template <class Config, class Worker>
static void registerWorker(Core::Id runMode, int priority = 0)
{
auto constraint = [](RunConfiguration *runConfig) { return qobject_cast<Config *>(runConfig) != nullptr; };
auto producer = [](RunControl *rc) { return new Worker(rc); };
- addWorkerFactory({runMode, constraint, producer, priority});
+ (void) new RunWorkerFactory(runMode, constraint, producer, priority);
}
static WorkerCreator producer(RunConfiguration *runConfiguration, Core::Id runMode);
@@ -570,7 +577,6 @@ private:
friend class RunWorker;
friend class Internal::RunWorkerPrivate;
- static void addWorkerFactory(const RunWorkerFactory &workerFactory);
Internal::RunControlPrivate *d;
};