From c97cb8b50ccd99efcc53b57b4168f3959bef49e8 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Wed, 12 Oct 2022 08:26:39 +0200 Subject: [PATCH] MesonProcess: Fix process restart It looks like MesonProjectParser::m_process may be restarted directly from process' finished() handler - inside MesonProjectParser::processFinished(). In this case the process is directly deleted from its signal handler. Fix it by releasing the old process and deleting it later. Don't pass process reference to the other thread when calling runAsync(). Pass the copy of standard output instead. Change-Id: I163a3cc86fbdbe8a3d9a19c479f96017f5803f76 Reviewed-by: Orgad Shaneh --- .../mesonprojectmanager/mesonprocess.cpp | 2 ++ .../mesonprojectparser.cpp | 20 +++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/plugins/mesonprojectmanager/mesonprocess.cpp b/src/plugins/mesonprojectmanager/mesonprocess.cpp index da6afe8656e..fbd659ec8af 100644 --- a/src/plugins/mesonprojectmanager/mesonprocess.cpp +++ b/src/plugins/mesonprojectmanager/mesonprocess.cpp @@ -85,6 +85,8 @@ void MesonProcess::setupProcess(const Command &command, const Environment env, bool captureStdo) { + if (m_process) + m_process.release()->deleteLater(); m_process.reset(new QtcProcess); connect(m_process.get(), &QtcProcess::done, this, &MesonProcess::handleProcessDone); if (!captureStdo) { diff --git a/src/plugins/mesonprojectmanager/mesonprojectparser.cpp b/src/plugins/mesonprojectmanager/mesonprojectparser.cpp index dfa8da8e172..8ba63bc0961 100644 --- a/src/plugins/mesonprojectmanager/mesonprojectparser.cpp +++ b/src/plugins/mesonprojectmanager/mesonprojectparser.cpp @@ -196,20 +196,18 @@ QList MesonProjectParser::appsTargets() const } return apps; } + bool MesonProjectParser::startParser() { m_parserFutureResult = Utils::runAsync( - ProjectExplorer::ProjectExplorerPlugin::sharedThreadPool(), - [process = &m_process, - introType = m_introType, - buildDir = m_buildDir.toString(), - srcDir = m_srcDir]() { - if (introType == IntroDataType::file) { - return extractParserResults(srcDir, MesonInfoParser::parse(buildDir)); - } else { - return extractParserResults(srcDir, MesonInfoParser::parse(process->stdOut())); - } - }); + ProjectExplorer::ProjectExplorerPlugin::sharedThreadPool(), + [processOutput = m_process.stdOut(), introType = m_introType, + buildDir = m_buildDir.toString(), srcDir = m_srcDir] { + if (introType == IntroDataType::file) + return extractParserResults(srcDir, MesonInfoParser::parse(buildDir)); + else + return extractParserResults(srcDir, MesonInfoParser::parse(processOutput)); + }); Utils::onFinished(m_parserFutureResult, this, &MesonProjectParser::update); return true;