diff options
author | Alex Trotsenko <alex1973tr@gmail.com> | 2021-06-15 19:51:36 +0300 |
---|---|---|
committer | Alex Trotsenko <alex1973tr@gmail.com> | 2021-06-18 17:25:43 +0300 |
commit | a73ec95c1e5aea907ac4618122f4715924c883e6 (patch) | |
tree | 7b9910d7a0bf0e6644251f5cb48dec7a70f0d0ac /src/corelib/io | |
parent | e6a969954a9e6865e5f662acd1d949561f8ef3be (diff) |
Allow destruction of QWindowsPipeReader in its signal
As a result, we can refrain from using the deleteLater() technique in
QProcess and avoid long-lived soft leaks in blocking applications.
Change-Id: I89e02b02551a668b995ad3d12d3ce9575b2dd9dd
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de>
Diffstat (limited to 'src/corelib/io')
-rw-r--r-- | src/corelib/io/qprocess_win.cpp | 21 | ||||
-rw-r--r-- | src/corelib/io/qwindowspipereader.cpp | 16 |
2 files changed, 18 insertions, 19 deletions
diff --git a/src/corelib/io/qprocess_win.cpp b/src/corelib/io/qprocess_win.cpp index 65422659b0..e557d10453 100644 --- a/src/corelib/io/qprocess_win.cpp +++ b/src/corelib/io/qprocess_win.cpp @@ -359,22 +359,15 @@ void QProcessPrivate::destroyPipe(Q_PIPE pipe[2]) } } -template <class T> -void deleteWorker(T *&worker) -{ - if (!worker) - return; - worker->stop(); - worker->deleteLater(); - worker = nullptr; -} - void QProcessPrivate::closeChannel(Channel *channel) { - if (channel == &stdinChannel) - deleteWorker(channel->writer); - else - deleteWorker(channel->reader); + if (channel == &stdinChannel) { + delete channel->writer; + channel->writer = nullptr; + } else { + delete channel->reader; + channel->reader = nullptr; + } destroyPipe(channel->pipe); } diff --git a/src/corelib/io/qwindowspipereader.cpp b/src/corelib/io/qwindowspipereader.cpp index d1a1782529..4d2f008eeb 100644 --- a/src/corelib/io/qwindowspipereader.cpp +++ b/src/corelib/io/qwindowspipereader.cpp @@ -41,6 +41,7 @@ #include "qwindowspipereader_p.h" #include <qcoreapplication.h> #include <QMutexLocker> +#include <QPointer> QT_BEGIN_NAMESPACE @@ -425,12 +426,17 @@ bool QWindowsPipeReader::consumePendingAndEmit(bool allowWinActPosting) if (state != Running) return false; - if (emitReadyRead) - emit readyRead(); - if (emitPipeClosed) { - if (dwError != ERROR_BROKEN_PIPE && dwError != ERROR_PIPE_NOT_CONNECTED) + if (!emitPipeClosed) { + if (emitReadyRead) + emit readyRead(); + } else { + QPointer<QWindowsPipeReader> alive(this); + if (emitReadyRead) + emit readyRead(); + if (alive && dwError != ERROR_BROKEN_PIPE && dwError != ERROR_PIPE_NOT_CONNECTED) emit winError(dwError, QLatin1String("QWindowsPipeReader::consumePendingAndEmit")); - emit pipeClosed(); + if (alive) + emit pipeClosed(); } return emitReadyRead; |