diff --git a/src/network/socket/qlocalsocket_win.cpp b/src/network/socket/qlocalsocket_win.cpp index 34e0fe19f1..e8797ba4ab 100644 --- a/src/network/socket/qlocalsocket_win.cpp +++ b/src/network/socket/qlocalsocket_win.cpp @@ -336,22 +336,23 @@ void QLocalSocketPrivate::_q_pipeClosed() if (state == QLocalSocket::UnconnectedState) return; - emit q->readChannelFinished(); if (state != QLocalSocket::ClosingState) { state = QLocalSocket::ClosingState; emit q->stateChanged(state); if (state != QLocalSocket::ClosingState) return; } - state = QLocalSocket::UnconnectedState; - emit q->stateChanged(state); - emit q->disconnected(); pipeReader->stop(); delete pipeWriter; pipeWriter = nullptr; destroyPipeHandles(); handle = INVALID_HANDLE_VALUE; + + state = QLocalSocket::UnconnectedState; + emit q->stateChanged(state); + emit q->readChannelFinished(); + emit q->disconnected(); } qint64 QLocalSocket::bytesAvailable() const diff --git a/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp b/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp index cec783985d..8c5fff8aad 100644 --- a/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp +++ b/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp @@ -144,6 +144,9 @@ private slots: void verifyListenWithDescriptor_data(); void serverBindingsAndProperties(); + +protected slots: + void socketClosedSlot(); }; tst_QLocalSocket::tst_QLocalSocket() @@ -1543,11 +1546,23 @@ void tst_QLocalSocket::bytesWrittenSignal() QVERIFY(writeThread.wait(2000)); } +void tst_QLocalSocket::socketClosedSlot() +{ + QLocalSocket *socket = qobject_cast(sender()); + + QCOMPARE(socket->state(), QLocalSocket::UnconnectedState); +} + void tst_QLocalSocket::syncDisconnectNotify() { QLocalServer server; QVERIFY(server.listen("syncDisconnectNotify")); QLocalSocket client; + connect(&client, &QLocalSocket::disconnected, + this, &tst_QLocalSocket::socketClosedSlot); + connect(&client, &QIODevice::readChannelFinished, + this, &tst_QLocalSocket::socketClosedSlot); + client.connectToServer("syncDisconnectNotify"); QVERIFY(server.waitForNewConnection()); QLocalSocket* serverSocket = server.nextPendingConnection(); @@ -1563,12 +1578,19 @@ void tst_QLocalSocket::asyncDisconnectNotify() QVERIFY(server.listen("asyncDisconnectNotify")); QLocalSocket client; QSignalSpy disconnectedSpy(&client, SIGNAL(disconnected())); + QSignalSpy readChannelFinishedSpy(&client, SIGNAL(readChannelFinished())); + connect(&client, &QLocalSocket::disconnected, + this, &tst_QLocalSocket::socketClosedSlot); + connect(&client, &QIODevice::readChannelFinished, + this, &tst_QLocalSocket::socketClosedSlot); + client.connectToServer("asyncDisconnectNotify"); QVERIFY(server.waitForNewConnection()); QLocalSocket* serverSocket = server.nextPendingConnection(); QVERIFY(serverSocket); delete serverSocket; QTRY_VERIFY(!disconnectedSpy.isEmpty()); + QCOMPARE(readChannelFinishedSpy.count(), 1); } void tst_QLocalSocket::verifySocketOptions_data()