summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/io/qwindowspipereader.cpp24
-rw-r--r--src/corelib/io/qwindowspipereader_p.h1
-rw-r--r--src/network/socket/qlocalsocket_win.cpp1
-rw-r--r--tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp3
4 files changed, 24 insertions, 5 deletions
diff --git a/src/corelib/io/qwindowspipereader.cpp b/src/corelib/io/qwindowspipereader.cpp
index 5415ad7830e..4435a47cab0 100644
--- a/src/corelib/io/qwindowspipereader.cpp
+++ b/src/corelib/io/qwindowspipereader.cpp
@@ -104,6 +104,7 @@ void QWindowsPipeReader::setHandle(HANDLE hPipeReadEnd)
void QWindowsPipeReader::stop()
{
cancelAsyncRead(Stopped);
+ pipeBroken = true;
}
/*!
@@ -113,6 +114,22 @@ void QWindowsPipeReader::stop()
void QWindowsPipeReader::drainAndStop()
{
cancelAsyncRead(Draining);
+ pipeBroken = true;
+}
+
+/*!
+ Stops the asynchronous read sequence.
+ Clears the internal buffer and discards any pending data.
+ */
+void QWindowsPipeReader::stopAndClear()
+{
+ cancelAsyncRead(Stopped);
+ readBuffer.clear();
+ actualReadBufferSize = 0;
+ // QLocalSocket is supposed to write data in the 'Closing'
+ // state, so we don't set 'pipeBroken' flag here. Also, avoid
+ // setting this flag in checkForReadyRead().
+ lastError = ERROR_SUCCESS;
}
/*!
@@ -120,7 +137,6 @@ void QWindowsPipeReader::drainAndStop()
*/
void QWindowsPipeReader::cancelAsyncRead(State newState)
{
- pipeBroken = true;
if (state != Running)
return;
@@ -147,9 +163,9 @@ void QWindowsPipeReader::cancelAsyncRead(State newState)
}
mutex.unlock();
- // Because pipeBroken was set earlier, finish reading to keep the class
- // state consistent. Note that signals are not emitted in the call
- // below, as the caller is expected to do that synchronously.
+ // Finish reading to keep the class state consistent. Note that
+ // signals are not emitted in the call below, as the caller is
+ // expected to do that synchronously.
consumePending();
}
diff --git a/src/corelib/io/qwindowspipereader_p.h b/src/corelib/io/qwindowspipereader_p.h
index 5eb62cb393d..22a4365f020 100644
--- a/src/corelib/io/qwindowspipereader_p.h
+++ b/src/corelib/io/qwindowspipereader_p.h
@@ -71,6 +71,7 @@ public:
void startAsyncRead();
void stop();
void drainAndStop();
+ void stopAndClear();
void setMaxReadBufferSize(qint64 size);
qint64 maxReadBufferSize() const { return readBufferMaxSize; }
diff --git a/src/network/socket/qlocalsocket_win.cpp b/src/network/socket/qlocalsocket_win.cpp
index b98dcb0dbcd..f7e72c055bb 100644
--- a/src/network/socket/qlocalsocket_win.cpp
+++ b/src/network/socket/qlocalsocket_win.cpp
@@ -396,6 +396,7 @@ void QLocalSocket::close()
Q_D(QLocalSocket);
QIODevice::close();
+ d->pipeReader->stopAndClear();
d->serverName = QString();
d->fullServerName = QString();
disconnectFromServer();
diff --git a/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp b/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp
index 5de1fa2b583..ed665253da1 100644
--- a/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp
+++ b/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp
@@ -1372,7 +1372,7 @@ void tst_QLocalSocket::delayedDisconnect()
QVERIFY(serverSocket);
connect(serverSocket, &QLocalSocket::aboutToClose, [serverSocket]() {
QVERIFY(serverSocket->isOpen());
- QVERIFY(serverSocket->getChar(nullptr));
+ QCOMPARE(serverSocket->bytesAvailable(), qint64(1));
});
QVERIFY(socket.putChar(0));
@@ -1386,6 +1386,7 @@ void tst_QLocalSocket::delayedDisconnect()
serverSocket->close();
QCOMPARE(serverSocket->state(), QLocalSocket::UnconnectedState);
QVERIFY(!serverSocket->isOpen());
+ QCOMPARE(serverSocket->bytesAvailable(), qint64(0));
}
void tst_QLocalSocket::removeServer()