summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Trotsenko <[email protected]>2021-07-12 20:00:50 +0300
committerAlex Trotsenko <[email protected]>2021-07-25 10:06:27 +0300
commit921ff400bbb84b0a5c51a9a04675dce17dac0cd8 (patch)
tree16a64d1e02ba845390ffb7014f578cac7c5f6e08
parentf18d8fd1fb405d2cefea298e2383e5a2e76fcd7a (diff)
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 <[email protected]>
-rw-r--r--src/network/socket/qlocalsocket.cpp9
-rw-r--r--src/network/socket/qlocalsocket_win.cpp16
-rw-r--r--tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp7
3 files changed, 12 insertions, 20 deletions
diff --git a/src/network/socket/qlocalsocket.cpp b/src/network/socket/qlocalsocket.cpp
index fba7f756633..a42b70546cd 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 5d0fdfb0238..229efe02268 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 83cecdda6b5..5cf02d35810 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));