Assert that startLauncher() was called before starting any QtcProcess

Change-Id: Ieab97f7428c04ba90fc9a637ed8c29c8e97dec69
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
Jarek Kobus
2021-08-19 14:34:46 +02:00
parent ef45478707
commit 7bc8672968
3 changed files with 21 additions and 6 deletions

View File

@@ -94,6 +94,8 @@ public:
void setPathToLauncher(const QString &path) { if (!path.isEmpty()) m_pathToLauncher = path; } void setPathToLauncher(const QString &path) { if (!path.isEmpty()) m_pathToLauncher = path; }
QString launcherFilePath() const { return m_pathToLauncher + QLatin1String("/qtcreator_processlauncher"); } QString launcherFilePath() const { return m_pathToLauncher + QLatin1String("/qtcreator_processlauncher"); }
void setStarted(bool started) { m_startRequested = started; }
bool isStarted() const { return m_startRequests; }
signals: signals:
void errorOccurred(const QString &error); void errorOccurred(const QString &error);
@@ -103,6 +105,7 @@ private:
Internal::LauncherProcess *m_process = nullptr; Internal::LauncherProcess *m_process = nullptr;
QString m_pathToLauncher; QString m_pathToLauncher;
int m_startRequests = 0; int m_startRequests = 0;
std::atomic_bool m_startRequested = false;
}; };
LauncherInterfacePrivate::LauncherInterfacePrivate() LauncherInterfacePrivate::LauncherInterfacePrivate()
@@ -213,24 +216,27 @@ LauncherInterface::~LauncherInterface()
// Called from main thread // Called from main thread
void LauncherInterface::startLauncher(const QString &pathToLauncher) void LauncherInterface::startLauncher(const QString &pathToLauncher)
{ {
LauncherInterface &iface = instance(); LauncherInterfacePrivate *p = instance().m_private;
iface.m_private->setPathToLauncher(pathToLauncher); p->setPathToLauncher(pathToLauncher);
const FilePath launcherFilePath = FilePath::fromString(iface.m_private->launcherFilePath()) const FilePath launcherFilePath = FilePath::fromString(p->launcherFilePath())
.cleanPath().withExecutableSuffix(); .cleanPath().withExecutableSuffix();
auto launcherIsNotExecutable = [&launcherFilePath]() { auto launcherIsNotExecutable = [&launcherFilePath]() {
qWarning() << "The Creator's process launcher" qWarning() << "The Creator's process launcher"
<< launcherFilePath << "is not executable."; << launcherFilePath << "is not executable.";
}; };
QTC_ASSERT(launcherFilePath.isExecutableFile(), launcherIsNotExecutable()); QTC_ASSERT(launcherFilePath.isExecutableFile(), launcherIsNotExecutable(); return);
p->setStarted(true);
// Call in launcher's thread. // Call in launcher's thread.
QMetaObject::invokeMethod(iface.m_private, &LauncherInterfacePrivate::doStart); QMetaObject::invokeMethod(p, &LauncherInterfacePrivate::doStart);
} }
// Called from main thread // Called from main thread
void LauncherInterface::stopLauncher() void LauncherInterface::stopLauncher()
{ {
LauncherInterfacePrivate *p = instance().m_private;
p->setStarted(false);
// Call in launcher's thread. // Call in launcher's thread.
QMetaObject::invokeMethod(instance().m_private, &LauncherInterfacePrivate::doStop); QMetaObject::invokeMethod(p, &LauncherInterfacePrivate::doStop);
} }
Internal::LauncherSocket *LauncherInterface::socket() Internal::LauncherSocket *LauncherInterface::socket()
@@ -238,6 +244,10 @@ Internal::LauncherSocket *LauncherInterface::socket()
return instance().m_private->socket(); return instance().m_private->socket();
} }
bool LauncherInterface::isStarted()
{
return instance().m_private->isStarted();
}
} // namespace Utils } // namespace Utils

View File

@@ -43,6 +43,7 @@ public:
static void startLauncher(const QString &pathToLauncher = {}); static void startLauncher(const QString &pathToLauncher = {});
static void stopLauncher(); static void stopLauncher();
static Internal::LauncherSocket *socket(); static Internal::LauncherSocket *socket();
static bool isStarted();
signals: signals:
void errorOccurred(const QString &error); void errorOccurred(const QString &error);

View File

@@ -462,6 +462,10 @@ void LauncherHandle::start(const QString &program, const QStringList &arguments,
// TODO: check if m_canceled is not true // TODO: check if m_canceled is not true
m_processState = QProcess::Starting; m_processState = QProcess::Starting;
m_writeData = writeData; 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()) if (LauncherInterface::socket()->isReady())
doStart(); doStart();
} }