From 7e747e25bbc4639398dde627373184c5448e6bc2 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Fri, 16 Jul 2021 11:38:34 +0200 Subject: [PATCH] Pipe readyRead() through the CallerHandle In this way the output and error channels get handled while waitingFor* is being executed. Change-Id: I8d3d81bd99fcfb7ddea7e98337e859446380055f Reviewed-by: hjk --- src/libs/utils/launchersocket.cpp | 27 +++++++++++++++++++++++---- src/libs/utils/launchersocket.h | 1 + 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/libs/utils/launchersocket.cpp b/src/libs/utils/launchersocket.cpp index a93dccf9a01..bf15a8e2922 100644 --- a/src/libs/utils/launchersocket.cpp +++ b/src/libs/utils/launchersocket.cpp @@ -42,6 +42,7 @@ public: enum class SignalType { Started, + ReadyRead, Finished }; @@ -59,6 +60,9 @@ public: case SignalType::Started: emit started(); break; + case SignalType::ReadyRead: + emit readyRead(); + break; case SignalType::Finished: emit finished(); break; @@ -68,6 +72,7 @@ public: void appendSignal(SignalType signalType) { QMutexLocker locker(&m_mutex); m_signals.append(signalType); } signals: void started(); + void readyRead(); void finished(); private: QMutex m_mutex; @@ -161,13 +166,11 @@ void LauncherHandle::handleFinishedPacket(const QByteArray &packetData) m_exitCode = packet.exitCode; m_stdout = packet.stdOut; m_stderr = packet.stdErr; - if (!m_stdout.isEmpty()) - emit readyReadStandardOutput(); - if (!m_stderr.isEmpty()) - emit readyReadStandardError(); m_errorString = packet.errorString; m_exitStatus = packet.exitStatus; if (m_callerHandle) { + if (!m_stdout.isEmpty() || !m_stderr.isEmpty()) + m_callerHandle->appendSignal(CallerHandle::SignalType::ReadyRead); m_callerHandle->appendSignal(CallerHandle::SignalType::Finished); flushCaller(); } @@ -270,6 +273,7 @@ void LauncherHandle::createCallerHandle() QTC_CHECK(m_callerHandle == nullptr); m_callerHandle = new CallerHandle(); connect(m_callerHandle, &CallerHandle::started, this, &LauncherHandle::slotStarted, Qt::DirectConnection); + connect(m_callerHandle, &CallerHandle::readyRead, this, &LauncherHandle::slotReadyRead, Qt::DirectConnection); connect(m_callerHandle, &CallerHandle::finished, this, &LauncherHandle::slotFinished, Qt::DirectConnection); } @@ -286,6 +290,21 @@ void LauncherHandle::slotStarted() emit started(); } +void LauncherHandle::slotReadyRead() +{ + bool hasOutput = false; + bool hasError = false; + { + QMutexLocker locker(&m_mutex); + hasOutput = !m_stdout.isEmpty(); + hasError = !m_stderr.isEmpty(); + } + if (hasOutput) + emit readyReadStandardOutput(); + if (hasError) + emit readyReadStandardError(); +} + void LauncherHandle::slotFinished() { int exitCode = 0; diff --git a/src/libs/utils/launchersocket.h b/src/libs/utils/launchersocket.h index e8a9ba460c6..127a94ac4ee 100644 --- a/src/libs/utils/launchersocket.h +++ b/src/libs/utils/launchersocket.h @@ -121,6 +121,7 @@ private: void doStart(); void slotStarted(); + void slotReadyRead(); void slotFinished(); // called from this thread