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; }
|
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
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user