From 7bc8672968f99408c2530e48ce4605bcd604ede6 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Thu, 19 Aug 2021 14:34:46 +0200 Subject: [PATCH] Assert that startLauncher() was called before starting any QtcProcess Change-Id: Ieab97f7428c04ba90fc9a637ed8c29c8e97dec69 Reviewed-by: Christian Stenger --- src/libs/utils/launcherinterface.cpp | 22 ++++++++++++++++------ src/libs/utils/launcherinterface.h | 1 + src/libs/utils/launchersocket.cpp | 4 ++++ 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/libs/utils/launcherinterface.cpp b/src/libs/utils/launcherinterface.cpp index 2fa9e5125b3..1b96ceac20c 100644 --- a/src/libs/utils/launcherinterface.cpp +++ b/src/libs/utils/launcherinterface.cpp @@ -94,6 +94,8 @@ public: void setPathToLauncher(const QString &path) { if (!path.isEmpty()) m_pathToLauncher = path; } QString launcherFilePath() const { return m_pathToLauncher + QLatin1String("/qtcreator_processlauncher"); } + void setStarted(bool started) { m_startRequested = started; } + bool isStarted() const { return m_startRequests; } signals: void errorOccurred(const QString &error); @@ -103,6 +105,7 @@ private: Internal::LauncherProcess *m_process = nullptr; QString m_pathToLauncher; int m_startRequests = 0; + std::atomic_bool m_startRequested = false; }; LauncherInterfacePrivate::LauncherInterfacePrivate() @@ -213,24 +216,27 @@ LauncherInterface::~LauncherInterface() // Called from main thread void LauncherInterface::startLauncher(const QString &pathToLauncher) { - LauncherInterface &iface = instance(); - iface.m_private->setPathToLauncher(pathToLauncher); - const FilePath launcherFilePath = FilePath::fromString(iface.m_private->launcherFilePath()) + LauncherInterfacePrivate *p = instance().m_private; + p->setPathToLauncher(pathToLauncher); + const FilePath launcherFilePath = FilePath::fromString(p->launcherFilePath()) .cleanPath().withExecutableSuffix(); auto launcherIsNotExecutable = [&launcherFilePath]() { qWarning() << "The Creator's process launcher" << launcherFilePath << "is not executable."; }; - QTC_ASSERT(launcherFilePath.isExecutableFile(), launcherIsNotExecutable()); + QTC_ASSERT(launcherFilePath.isExecutableFile(), launcherIsNotExecutable(); return); + p->setStarted(true); // Call in launcher's thread. - QMetaObject::invokeMethod(iface.m_private, &LauncherInterfacePrivate::doStart); + QMetaObject::invokeMethod(p, &LauncherInterfacePrivate::doStart); } // Called from main thread void LauncherInterface::stopLauncher() { + LauncherInterfacePrivate *p = instance().m_private; + p->setStarted(false); // Call in launcher's thread. - QMetaObject::invokeMethod(instance().m_private, &LauncherInterfacePrivate::doStop); + QMetaObject::invokeMethod(p, &LauncherInterfacePrivate::doStop); } Internal::LauncherSocket *LauncherInterface::socket() @@ -238,6 +244,10 @@ Internal::LauncherSocket *LauncherInterface::socket() return instance().m_private->socket(); } +bool LauncherInterface::isStarted() +{ + return instance().m_private->isStarted(); +} } // namespace Utils diff --git a/src/libs/utils/launcherinterface.h b/src/libs/utils/launcherinterface.h index c84a5e1be21..2836cc594b0 100644 --- a/src/libs/utils/launcherinterface.h +++ b/src/libs/utils/launcherinterface.h @@ -43,6 +43,7 @@ public: static void startLauncher(const QString &pathToLauncher = {}); static void stopLauncher(); static Internal::LauncherSocket *socket(); + static bool isStarted(); signals: void errorOccurred(const QString &error); diff --git a/src/libs/utils/launchersocket.cpp b/src/libs/utils/launchersocket.cpp index 7e98fdc3daf..0a6e7b54dd4 100644 --- a/src/libs/utils/launchersocket.cpp +++ b/src/libs/utils/launchersocket.cpp @@ -462,6 +462,10 @@ void LauncherHandle::start(const QString &program, const QStringList &arguments, // TODO: check if m_canceled is not true m_processState = QProcess::Starting; m_writeData = writeData; + auto processLauncherNotStarted = [&program] { + qWarning() << "Trying to start" << program << "while process launcher wasn't started yet."; + }; + QTC_ASSERT(LauncherInterface::isStarted(), processLauncherNotStarted()); if (LauncherInterface::socket()->isReady()) doStart(); }