summaryrefslogtreecommitdiffstats
path: root/src/corelib/io/qwindowspipewriter.cpp
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@qt.io>2017-07-19 09:47:29 +0200
committerSimon Hausmann <simon.hausmann@qt.io>2017-07-19 09:47:29 +0200
commit407302fb1b823fbe0ae09c031862f87b252489e6 (patch)
treef192faf40b9009ee6a884ed4b7d0b3942b6810ac /src/corelib/io/qwindowspipewriter.cpp
parent0f30dcaea8129092142fe87d2d14209c75363f66 (diff)
parentad3b41a06d9ba7219c79b5548c5b11698787288d (diff)
Merge remote-tracking branch 'origin/5.9' into dev
Conflicts: src/corelib/io/qwindowspipewriter.cpp src/widgets/styles/qcommonstyle.cpp Change-Id: I0d33efdc4dc256e234abc490a18ccda72cd1d9e6
Diffstat (limited to 'src/corelib/io/qwindowspipewriter.cpp')
-rw-r--r--src/corelib/io/qwindowspipewriter.cpp22
1 files changed, 15 insertions, 7 deletions
diff --git a/src/corelib/io/qwindowspipewriter.cpp b/src/corelib/io/qwindowspipewriter.cpp
index 06a3572fad..8e3de2d620 100644
--- a/src/corelib/io/qwindowspipewriter.cpp
+++ b/src/corelib/io/qwindowspipewriter.cpp
@@ -56,7 +56,7 @@ void QWindowsPipeWriter::Overlapped::clear()
QWindowsPipeWriter::QWindowsPipeWriter(HANDLE pipeWriteEnd, QObject *parent)
: QObject(parent),
handle(pipeWriteEnd),
- overlapped(this),
+ overlapped(nullptr),
pendingBytesWrittenValue(0),
stopped(true),
writeSequenceStarted(false),
@@ -71,6 +71,7 @@ QWindowsPipeWriter::QWindowsPipeWriter(HANDLE pipeWriteEnd, QObject *parent)
QWindowsPipeWriter::~QWindowsPipeWriter()
{
stop();
+ delete overlapped;
}
bool QWindowsPipeWriter::waitForWrite(int msecs)
@@ -121,7 +122,10 @@ void QWindowsPipeWriter::writeFileCompleted(DWORD errorCode, DWORD numberOfBytes
OVERLAPPED *overlappedBase)
{
Overlapped *overlapped = static_cast<Overlapped *>(overlappedBase);
- overlapped->pipeWriter->notified(errorCode, numberOfBytesTransfered);
+ if (overlapped->pipeWriter)
+ overlapped->pipeWriter->notified(errorCode, numberOfBytesTransfered);
+ else
+ delete overlapped;
}
/*!
@@ -183,12 +187,14 @@ bool QWindowsPipeWriter::write(const QByteArray &ba)
if (writeSequenceStarted)
return false;
- overlapped.clear();
+ if (!overlapped)
+ overlapped = new Overlapped(this);
+ overlapped->clear();
buffer = ba;
stopped = false;
writeSequenceStarted = true;
if (!WriteFileEx(handle, buffer.constData(), buffer.size(),
- &overlapped, &writeFileCompleted)) {
+ overlapped, &writeFileCompleted)) {
writeSequenceStarted = false;
buffer.clear();
qErrnoWarning("QWindowsPipeWriter::write failed.");
@@ -204,14 +210,16 @@ void QWindowsPipeWriter::stop()
bytesWrittenPending = false;
pendingBytesWrittenValue = 0;
if (writeSequenceStarted) {
- if (!CancelIoEx(handle, &overlapped)) {
+ overlapped->pipeWriter = nullptr;
+ if (!CancelIoEx(handle, overlapped)) {
const DWORD dwError = GetLastError();
if (dwError != ERROR_NOT_FOUND) {
- qErrnoWarning(dwError, "QWindowsPipeWriter: qt_cancelIo on handle %x failed.",
+ qErrnoWarning(dwError, "QWindowsPipeWriter: CancelIoEx on handle %p failed.",
handle);
}
}
- waitForNotification(-1);
+ overlapped = nullptr; // The object will be deleted in the I/O callback.
+ writeSequenceStarted = false;
}
}