forked from qt-creator/qt-creator
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:
@@ -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
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user