summaryrefslogtreecommitdiffstats
path: root/src/network/socket/qlocalsocket_win.cpp
diff options
context:
space:
mode:
authorAlex Trotsenko <alex1973tr@gmail.com>2021-05-07 18:16:17 +0300
committerAlex Trotsenko <alex1973tr@gmail.com>2021-06-09 20:29:04 +0300
commit5b78d7fdcf9b758f117eaa65dc5eeddd0d4557e0 (patch)
tree8461b6d21a8c146a5e9e10d5d51385e1d790abff /src/network/socket/qlocalsocket_win.cpp
parentc6c6e01e893b211f51511929b4258f789cdfd428 (diff)
QLocalSocket/Win: avoid double buffering on write
As QWindowsPipeWriter now maintains a chunk queue, there is no need to use the internal QIODevice buffer and wait for the previous operation to complete. Change-Id: Id4d54edfe920aeb4a534980cb0cc85a56c067a70 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de>
Diffstat (limited to 'src/network/socket/qlocalsocket_win.cpp')
-rw-r--r--src/network/socket/qlocalsocket_win.cpp41
1 files changed, 11 insertions, 30 deletions
diff --git a/src/network/socket/qlocalsocket_win.cpp b/src/network/socket/qlocalsocket_win.cpp
index 02e2b5d0a3..912ebf412c 100644
--- a/src/network/socket/qlocalsocket_win.cpp
+++ b/src/network/socket/qlocalsocket_win.cpp
@@ -157,7 +157,6 @@ QLocalSocketPrivate::QLocalSocketPrivate() : QIODevicePrivate(),
emittedReadyRead(false),
emittedBytesWritten(false)
{
- writeBufferChunkSize = QIODEVICE_BUFFERSIZE;
}
QLocalSocketPrivate::~QLocalSocketPrivate()
@@ -276,13 +275,18 @@ qint64 QLocalSocket::writeData(const char *data, qint64 len)
if (len == 0)
return 0;
- d->write(data, len);
+
if (!d->pipeWriter) {
d->pipeWriter = new QWindowsPipeWriter(d->handle, this);
QObjectPrivate::connect(d->pipeWriter, &QWindowsPipeWriter::bytesWritten,
d, &QLocalSocketPrivate::_q_bytesWritten);
}
- d->writeToSocket();
+
+ if (d->isWriteChunkCached(data, len))
+ d->pipeWriter->write(*(d->currentWriteChunk));
+ else
+ d->pipeWriter->write(data, len);
+
return len;
}
@@ -340,7 +344,7 @@ qint64 QLocalSocket::bytesAvailable() const
qint64 QLocalSocket::bytesToWrite() const
{
Q_D(const QLocalSocket);
- return d->writeBuffer.size() + d->pipeWriterBytesToWrite();
+ return d->pipeWriterBytesToWrite();
}
bool QLocalSocket::canReadLine() const
@@ -389,7 +393,6 @@ void QLocalSocket::disconnectFromServer()
// It must be destroyed before close() to prevent an infinite loop.
delete d->pipeWriter;
d->pipeWriter = 0;
- d->writeBuffer.clear();
}
flush();
@@ -434,21 +437,8 @@ void QLocalSocketPrivate::_q_bytesWritten(qint64 bytes)
QScopedValueRollback<bool> guard(emittedBytesWritten, true);
emit q->bytesWritten(bytes);
}
- if (writeBuffer.isEmpty()) {
- if (state == QLocalSocket::ClosingState && pipeWriterBytesToWrite() == 0)
- q->close();
- } else {
- writeToSocket();
- }
-}
-
-void QLocalSocketPrivate::writeToSocket()
-{
- Q_ASSERT(pipeWriter);
- Q_ASSERT(!writeBuffer.isEmpty());
-
- if (!pipeWriter->isWriteOperationActive())
- pipeWriter->write(writeBuffer.read());
+ if (state == QLocalSocket::ClosingState && pipeWriterBytesToWrite() == 0)
+ q->close();
}
qintptr QLocalSocket::socketDescriptor() const
@@ -489,9 +479,6 @@ bool QLocalSocket::waitForDisconnected(int msecs)
QDeadlineTimer deadline(msecs);
while (!d->pipeReader->isPipeClosed()) {
- if (!d->writeBuffer.isEmpty())
- d->writeToSocket();
-
QSocketPoller poller(*d);
if (!poller.poll(deadline))
return false;
@@ -525,9 +512,6 @@ bool QLocalSocket::waitForReadyRead(int msecs)
QDeadlineTimer deadline(msecs);
while (!d->pipeReader->isPipeClosed()) {
- if (!d->writeBuffer.isEmpty())
- d->writeToSocket();
-
QSocketPoller poller(*d);
if (poller.waitForClose || !poller.poll(deadline))
return false;
@@ -551,11 +535,8 @@ bool QLocalSocket::waitForBytesWritten(int msecs)
QDeadlineTimer deadline(msecs);
while (!d->pipeReader->isPipeClosed()) {
- if (!d->writeBuffer.isEmpty()) {
- d->writeToSocket();
- } else if (d->pipeWriterBytesToWrite() == 0) {
+ if (bytesToWrite() == 0)
return false;
- }
QSocketPoller poller(*d);
if (!poller.poll(deadline))