From de1bef18e21187f326da4e807b5e9a6fe149495c Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 29 Mar 2022 17:32:43 +0200 Subject: [PATCH] Utils: Work around readAllStandardError() with QProcess::MergedChannels Instead of relying QProcess to operate with MergedChannels, keep the separate channels and merge inside QtcProcess. Fixes: QTCREATORBUG-27196 Change-Id: I3039267fcd6d90f95f8212642e17049b87af1156 Reviewed-by: Jarek Kobus --- src/libs/utils/launchersocket.cpp | 29 ++++++++++++------- .../processlauncher/launchersockethandler.cpp | 2 -- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/libs/utils/launchersocket.cpp b/src/libs/utils/launchersocket.cpp index a044089e772..050d3d1fb02 100644 --- a/src/libs/utils/launchersocket.cpp +++ b/src/libs/utils/launchersocket.cpp @@ -222,21 +222,28 @@ void CallerHandle::handleStarted(const StartedSignal *launcherSignal) void CallerHandle::handleReadyRead(const ReadyReadSignal *launcherSignal) { QTC_ASSERT(isCalledFromCallersThread(), return); - if (m_setup->m_processChannelMode == QProcess::ForwardedOutputChannel - || m_setup->m_processChannelMode == QProcess::ForwardedChannels) { - std::cout << launcherSignal->stdOut().constData() << std::flush; - } else { + if (m_setup->m_processChannelMode == QProcess::MergedChannels) { m_stdout += launcherSignal->stdOut(); + m_stdout += launcherSignal->stdErr(); if (!m_stdout.isEmpty()) emit readyReadStandardOutput(); - } - if (m_setup->m_processChannelMode == QProcess::ForwardedErrorChannel - || m_setup->m_processChannelMode == QProcess::ForwardedChannels) { - std::cerr << launcherSignal->stdErr().constData() << std::flush; } else { - m_stderr += launcherSignal->stdErr(); - if (!m_stderr.isEmpty()) - emit readyReadStandardError(); + if (m_setup->m_processChannelMode == QProcess::ForwardedOutputChannel + || m_setup->m_processChannelMode == QProcess::ForwardedChannels) { + std::cout << launcherSignal->stdOut().constData() << std::flush; + } else { + m_stdout += launcherSignal->stdOut(); + if (!m_stdout.isEmpty()) + emit readyReadStandardOutput(); + } + if (m_setup->m_processChannelMode == QProcess::ForwardedErrorChannel + || m_setup->m_processChannelMode == QProcess::ForwardedChannels) { + std::cerr << launcherSignal->stdErr().constData() << std::flush; + } else { + m_stderr += launcherSignal->stdErr(); + if (!m_stderr.isEmpty()) + emit readyReadStandardError(); + } } } diff --git a/src/tools/processlauncher/launchersockethandler.cpp b/src/tools/processlauncher/launchersockethandler.cpp index e3468aa53e4..054a6e3966f 100644 --- a/src/tools/processlauncher/launchersockethandler.cpp +++ b/src/tools/processlauncher/launchersockethandler.cpp @@ -205,8 +205,6 @@ void LauncherSocketHandler::handleStartPacket() process->setEnvironment(packet.env); process->setWorkingDirectory(packet.workingDir); // Forwarding is handled by the LauncherInterface - process->setProcessChannelMode(packet.processChannelMode == QProcess::MergedChannels - ? QProcess::MergedChannels : QProcess::SeparateChannels); process->setStandardInputFile(packet.standardInputFile); ProcessStartHandler *handler = process->processStartHandler(); handler->setProcessMode(packet.processMode);