diff options
author | Alex Trotsenko <alex1973tr@gmail.com> | 2020-09-08 08:11:47 +0000 |
---|---|---|
committer | Alex Trotsenko <alex1973tr@gmail.com> | 2020-09-10 09:17:20 +0300 |
commit | 92640829ad9f14ac83d870ed119e2738983f5284 (patch) | |
tree | 36c63380d66a161113a00b8c25bea25247b00923 /src/corelib/io | |
parent | 9440d602e5b236e4981899aa7698578778065166 (diff) |
Revert "Do not wait in QWindowsPipe{Reader|Writer}::stop()"
This reverts commit c7ec07d40115bef849574c81d619b629af9434a9.
Reason for revert: This causes a memory leak on program termination.
The initial commit was an attempt to fix a deadlock where the user
destroys object from a thread that does not own the object. This is
an unsupported case and should be treated as an invalid report.
Pick-to: 5.15
Change-Id: I4957784b86a0361adb65b9d023542f96480f00ba
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de>
Diffstat (limited to 'src/corelib/io')
-rw-r--r-- | src/corelib/io/qwindowspipereader.cpp | 20 | ||||
-rw-r--r-- | src/corelib/io/qwindowspipereader_p.h | 2 | ||||
-rw-r--r-- | src/corelib/io/qwindowspipewriter.cpp | 20 | ||||
-rw-r--r-- | src/corelib/io/qwindowspipewriter_p.h | 2 |
4 files changed, 14 insertions, 30 deletions
diff --git a/src/corelib/io/qwindowspipereader.cpp b/src/corelib/io/qwindowspipereader.cpp index 1f03ac5d5a..c20909766d 100644 --- a/src/corelib/io/qwindowspipereader.cpp +++ b/src/corelib/io/qwindowspipereader.cpp @@ -58,7 +58,7 @@ void QWindowsPipeReader::Overlapped::clear() QWindowsPipeReader::QWindowsPipeReader(QObject *parent) : QObject(parent), handle(INVALID_HANDLE_VALUE), - overlapped(nullptr), + overlapped(this), readBufferMaxSize(0), actualReadBufferSize(0), stopped(true), @@ -75,7 +75,6 @@ QWindowsPipeReader::QWindowsPipeReader(QObject *parent) QWindowsPipeReader::~QWindowsPipeReader() { stop(); - delete overlapped; } /*! @@ -97,16 +96,14 @@ void QWindowsPipeReader::stop() { stopped = true; if (readSequenceStarted) { - overlapped->pipeReader = nullptr; - if (!CancelIoEx(handle, overlapped)) { + if (!CancelIoEx(handle, &overlapped)) { const DWORD dwError = GetLastError(); if (dwError != ERROR_NOT_FOUND) { qErrnoWarning(dwError, "QWindowsPipeReader: CancelIoEx on handle %p failed.", handle); } } - overlapped = nullptr; // The object will be deleted in the I/O callback. - readSequenceStarted = false; + waitForNotification(-1); } } @@ -227,10 +224,8 @@ void QWindowsPipeReader::startAsyncRead() stopped = false; readSequenceStarted = true; - if (!overlapped) - overlapped = new Overlapped(this); - overlapped->clear(); - if (!ReadFileEx(handle, ptr, bytesToRead, overlapped, &readFileCompleted)) { + overlapped.clear(); + if (!ReadFileEx(handle, ptr, bytesToRead, &overlapped, &readFileCompleted)) { readSequenceStarted = false; const DWORD dwError = GetLastError(); @@ -257,10 +252,7 @@ void QWindowsPipeReader::readFileCompleted(DWORD errorCode, DWORD numberOfBytesT OVERLAPPED *overlappedBase) { Overlapped *overlapped = static_cast<Overlapped *>(overlappedBase); - if (overlapped->pipeReader) - overlapped->pipeReader->notified(errorCode, numberOfBytesTransfered); - else - delete overlapped; + overlapped->pipeReader->notified(errorCode, numberOfBytesTransfered); } /*! diff --git a/src/corelib/io/qwindowspipereader_p.h b/src/corelib/io/qwindowspipereader_p.h index c757753c9c..5ec9dc379c 100644 --- a/src/corelib/io/qwindowspipereader_p.h +++ b/src/corelib/io/qwindowspipereader_p.h @@ -105,7 +105,7 @@ private: }; HANDLE handle; - Overlapped *overlapped; + Overlapped overlapped; qint64 readBufferMaxSize; QRingBuffer readBuffer; qint64 actualReadBufferSize; diff --git a/src/corelib/io/qwindowspipewriter.cpp b/src/corelib/io/qwindowspipewriter.cpp index 32536f495b..e374034a06 100644 --- a/src/corelib/io/qwindowspipewriter.cpp +++ b/src/corelib/io/qwindowspipewriter.cpp @@ -57,7 +57,7 @@ void QWindowsPipeWriter::Overlapped::clear() QWindowsPipeWriter::QWindowsPipeWriter(HANDLE pipeWriteEnd, QObject *parent) : QObject(parent), handle(pipeWriteEnd), - overlapped(nullptr), + overlapped(this), pendingBytesWrittenValue(0), stopped(true), writeSequenceStarted(false), @@ -72,7 +72,6 @@ QWindowsPipeWriter::QWindowsPipeWriter(HANDLE pipeWriteEnd, QObject *parent) QWindowsPipeWriter::~QWindowsPipeWriter() { stop(); - delete overlapped; } bool QWindowsPipeWriter::waitForWrite(int msecs) @@ -122,10 +121,7 @@ void QWindowsPipeWriter::writeFileCompleted(DWORD errorCode, DWORD numberOfBytes OVERLAPPED *overlappedBase) { Overlapped *overlapped = static_cast<Overlapped *>(overlappedBase); - if (overlapped->pipeWriter) - overlapped->pipeWriter->notified(errorCode, numberOfBytesTransfered); - else - delete overlapped; + overlapped->pipeWriter->notified(errorCode, numberOfBytesTransfered); } /*! @@ -187,14 +183,12 @@ bool QWindowsPipeWriter::write(const QByteArray &ba) if (writeSequenceStarted) return false; - if (!overlapped) - overlapped = new Overlapped(this); - overlapped->clear(); + overlapped.clear(); buffer = ba; stopped = false; writeSequenceStarted = true; if (!WriteFileEx(handle, buffer.constData(), buffer.size(), - overlapped, &writeFileCompleted)) { + &overlapped, &writeFileCompleted)) { writeSequenceStarted = false; buffer.clear(); @@ -218,16 +212,14 @@ void QWindowsPipeWriter::stop() bytesWrittenPending = false; pendingBytesWrittenValue = 0; if (writeSequenceStarted) { - overlapped->pipeWriter = nullptr; - if (!CancelIoEx(handle, overlapped)) { + if (!CancelIoEx(handle, &overlapped)) { const DWORD dwError = GetLastError(); if (dwError != ERROR_NOT_FOUND) { qErrnoWarning(dwError, "QWindowsPipeWriter: CancelIoEx on handle %p failed.", handle); } } - overlapped = nullptr; // The object will be deleted in the I/O callback. - writeSequenceStarted = false; + waitForNotification(-1); } } diff --git a/src/corelib/io/qwindowspipewriter_p.h b/src/corelib/io/qwindowspipewriter_p.h index 6c269e86b7..f7f68b688c 100644 --- a/src/corelib/io/qwindowspipewriter_p.h +++ b/src/corelib/io/qwindowspipewriter_p.h @@ -143,7 +143,7 @@ private: }; HANDLE handle; - Overlapped *overlapped; + Overlapped overlapped; QByteArray buffer; qint64 pendingBytesWrittenValue; bool stopped; |