diff options
Diffstat (limited to 'src/corelib/io/qprocess.cpp')
-rw-r--r-- | src/corelib/io/qprocess.cpp | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/src/corelib/io/qprocess.cpp b/src/corelib/io/qprocess.cpp index 823dc4c144..2392f7cbfd 100644 --- a/src/corelib/io/qprocess.cpp +++ b/src/corelib/io/qprocess.cpp @@ -1395,15 +1395,17 @@ QProcess::ProcessChannel QProcess::readChannel() const void QProcess::setReadChannel(ProcessChannel channel) { Q_D(QProcess); + + if (d->transactionStarted) { + qWarning("QProcess::setReadChannel: Failed due to the active read transaction"); + return; + } + if (d->processChannel != channel) { - QByteArray buf = d->buffer.readAll(); - if (d->processChannel == QProcess::StandardOutput) { - for (int i = buf.size() - 1; i >= 0; --i) - d->stdoutChannel.buffer.ungetChar(buf.at(i)); - } else { - for (int i = buf.size() - 1; i >= 0; --i) - d->stderrChannel.buffer.ungetChar(buf.at(i)); - } + QRingBuffer *buffer = (d->processChannel == QProcess::StandardOutput) + ? &d->stdoutChannel.buffer + : &d->stderrChannel.buffer; + d->buffer.read(buffer->reserveFront(d->buffer.size()), d->buffer.size()); } d->processChannel = channel; } |