From 921ff400bbb84b0a5c51a9a04675dce17dac0cd8 Mon Sep 17 00:00:00 2001 From: Alex Trotsenko Date: Mon, 12 Jul 2021 20:00:50 +0300 Subject: [PATCH] QLocalSocket/Win: allow delayed close to work This mechanism was neither properly designed nor correctly tested initially on Windows. [ChangeLog][QtNetwork][Important Behavior Changes] QLocalSocket on Windows now implements delayed closing, which is consistent with the behavior on Unix. Change-Id: Ic3bc427e68eea7f18201f6129df19fbc87d68101 Reviewed-by: Oswald Buddenhagen --- src/network/socket/qlocalsocket.cpp | 9 ++++++++- src/network/socket/qlocalsocket_win.cpp | 16 +--------------- .../socket/qlocalsocket/tst_qlocalsocket.cpp | 7 +++---- 3 files changed, 12 insertions(+), 20 deletions(-) diff --git a/src/network/socket/qlocalsocket.cpp b/src/network/socket/qlocalsocket.cpp index fba7f75663..a42b70546c 100644 --- a/src/network/socket/qlocalsocket.cpp +++ b/src/network/socket/qlocalsocket.cpp @@ -208,7 +208,14 @@ QT_BEGIN_NAMESPACE /*! \fn void QLocalSocket::close() - \reimp + + Closes the I/O device for the socket and calls disconnectFromServer() + to close the socket's connection. + + See QIODevice::close() for a description of the actions that occur when an I/O + device is closed. + + \sa abort() */ /*! diff --git a/src/network/socket/qlocalsocket_win.cpp b/src/network/socket/qlocalsocket_win.cpp index 5d0fdfb023..229efe0226 100644 --- a/src/network/socket/qlocalsocket_win.cpp +++ b/src/network/socket/qlocalsocket_win.cpp @@ -377,21 +377,11 @@ bool QLocalSocket::canReadLine() const void QLocalSocket::close() { Q_D(QLocalSocket); - if (openMode() == NotOpen) - return; QIODevice::close(); d->serverName = QString(); d->fullServerName = QString(); - - if (state() != UnconnectedState) { - if (bytesToWrite() > 0) { - disconnectFromServer(); - return; - } - - d->_q_pipeClosed(); - } + disconnectFromServer(); } bool QLocalSocket::flush() @@ -481,10 +471,6 @@ bool QLocalSocket::waitForDisconnected(int msecs) qWarning("QLocalSocket::waitForDisconnected() is not allowed in UnconnectedState"); return false; } - if (!openMode().testFlag(QIODevice::ReadOnly)) { - qWarning("QLocalSocket::waitForDisconnected isn't supported for write only pipes."); - return false; - } QDeadlineTimer deadline(msecs); while (!d->pipeReader->isPipeClosed()) { diff --git a/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp b/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp index 83cecdda6b..5cf02d3581 100644 --- a/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp +++ b/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp @@ -1498,17 +1498,16 @@ void tst_QLocalSocket::writeToClientAndDisconnect() QVERIFY(server.waitForNewConnection(200)); QLocalSocket* clientSocket = server.nextPendingConnection(); QVERIFY(clientSocket); + server.close(); char buffer[100]; memset(buffer, 0, sizeof(buffer)); for (int i = 0; i < chunks; ++i) QCOMPARE(clientSocket->write(buffer, sizeof(buffer)), qint64(sizeof(buffer))); - while (clientSocket->bytesToWrite()) - QVERIFY(clientSocket->waitForBytesWritten()); clientSocket->close(); - server.close(); + QVERIFY(clientSocket->waitForDisconnected()); - client.waitForDisconnected(); + QVERIFY(client.waitForDisconnected()); QCOMPARE(readChannelFinishedSpy.count(), 1); const QByteArray received = client.readAll(); QCOMPARE(received.size(), qint64(sizeof(buffer) * chunks));