diff options
author | Alex Trotsenko <alex1973tr@gmail.com> | 2021-05-22 16:53:41 +0300 |
---|---|---|
committer | Alex Trotsenko <alex1973tr@gmail.com> | 2021-06-04 14:50:47 +0300 |
commit | f03e9164c010cfaf125db4fd0c9792e793715298 (patch) | |
tree | a01b25133f2c2c410d08dd6e36b1a02a5830b8f0 /src/corelib/io/qprocess_win.cpp | |
parent | 467b39d52c9ab59b1e7518330fbb51d5543ada50 (diff) |
QProcess: untangle platform-specific details
- add missing #ifdef in header file;
- split some functions (writeData(), _q_canWrite(), cleanup()) into
their platform-specific implementations.
Change-Id: I4e7c1c377ec8468ed120d38acf2543eef9316c01
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de>
Diffstat (limited to 'src/corelib/io/qprocess_win.cpp')
-rw-r--r-- | src/corelib/io/qprocess_win.cpp | 69 |
1 files changed, 67 insertions, 2 deletions
diff --git a/src/corelib/io/qprocess_win.cpp b/src/corelib/io/qprocess_win.cpp index 24a6e2109c..65422659b0 100644 --- a/src/corelib/io/qprocess_win.cpp +++ b/src/corelib/io/qprocess_win.cpp @@ -39,6 +39,9 @@ ****************************************************************************/ //#define QPROCESS_DEBUG +#include <qdebug.h> +#include <private/qdebug_p.h> + #include "qprocess.h" #include "qprocess_p.h" #include "qwindowspipereader_p.h" @@ -50,9 +53,9 @@ #include <qrandom.h> #include <qwineventnotifier.h> #include <qscopedvaluerollback.h> +#include <qtimer.h> #include <private/qsystemlibrary_p.h> #include <private/qthread_p.h> -#include <qdebug.h> #include "private/qfsfileengine_p.h" // for longFileName @@ -375,6 +378,23 @@ void QProcessPrivate::closeChannel(Channel *channel) destroyPipe(channel->pipe); } +void QProcessPrivate::cleanup() +{ + q_func()->setProcessState(QProcess::NotRunning); + + closeChannels(); + delete stdinWriteTrigger; + stdinWriteTrigger = nullptr; + delete processFinishedNotifier; + processFinishedNotifier = nullptr; + if (pid) { + CloseHandle(pid->hThread); + CloseHandle(pid->hProcess); + delete pid; + pid = nullptr; + } +} + static QString qt_create_commandline(const QString &program, const QStringList &arguments, const QString &nativeArguments) { @@ -816,7 +836,6 @@ bool QProcessPrivate::waitForFinished(const QDeadlineTimer &deadline) return false; } - void QProcessPrivate::findExitCode() { DWORD theExitCode; @@ -828,6 +847,38 @@ void QProcessPrivate::findExitCode() } } +/*! \reimp +*/ +qint64 QProcess::writeData(const char *data, qint64 len) +{ + Q_D(QProcess); + + if (d->stdinChannel.closed) { +#if defined QPROCESS_DEBUG + qDebug("QProcess::writeData(%p \"%s\", %lld) == 0 (write channel closing)", + data, QtDebugUtils::toPrintable(data, len, 16).constData(), len); +#endif + return 0; + } + + if (!d->stdinWriteTrigger) { + d->stdinWriteTrigger = new QTimer; + d->stdinWriteTrigger->setSingleShot(true); + QObjectPrivate::connect(d->stdinWriteTrigger, &QTimer::timeout, + d, &QProcessPrivate::_q_canWrite); + } + + d->write(data, len); + if (!d->stdinWriteTrigger->isActive()) + d->stdinWriteTrigger->start(); + +#if defined QPROCESS_DEBUG + qDebug("QProcess::writeData(%p \"%s\", %lld) == %lld (written to buffer)", + data, QtDebugUtils::toPrintable(data, len, 16).constData(), len, len); +#endif + return len; +} + qint64 QProcessPrivate::pipeWriterBytesToWrite() const { return stdinChannel.writer ? stdinChannel.writer->bytesToWrite() : qint64(0); @@ -844,6 +895,20 @@ void QProcessPrivate::_q_bytesWritten(qint64 bytes) _q_canWrite(); } +bool QProcessPrivate::_q_canWrite() +{ + if (writeBuffer.isEmpty()) { + if (stdinChannel.closed && pipeWriterBytesToWrite() == 0) + closeWriteChannel(); +#if defined QPROCESS_DEBUG + qDebug("QProcessPrivate::canWrite(), not writing anything (empty write buffer)."); +#endif + return false; + } + + return writeToStdin(); +} + bool QProcessPrivate::writeToStdin() { Q_Q(QProcess); |