summaryrefslogtreecommitdiffstats
path: root/src/corelib/io
diff options
context:
space:
mode:
authorAlex Trotsenko <alex1973tr@gmail.com>2020-09-08 08:11:47 +0000
committerAlex Trotsenko <alex1973tr@gmail.com>2020-09-10 09:17:20 +0300
commit92640829ad9f14ac83d870ed119e2738983f5284 (patch)
tree36c63380d66a161113a00b8c25bea25247b00923 /src/corelib/io
parent9440d602e5b236e4981899aa7698578778065166 (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.cpp20
-rw-r--r--src/corelib/io/qwindowspipereader_p.h2
-rw-r--r--src/corelib/io/qwindowspipewriter.cpp20
-rw-r--r--src/corelib/io/qwindowspipewriter_p.h2
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;