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 <oswald.buddenhagen@gmx.de>
This commit is contained in:
parent
f18d8fd1fb
commit
921ff400bb
@ -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()
|
||||
*/
|
||||
|
||||
/*!
|
||||
|
@ -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()) {
|
||||
|
@ -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));
|
||||
|
Loading…
Reference in New Issue
Block a user