diff options
author | Alex Trotsenko <alex1973tr@gmail.com> | 2021-05-07 18:16:17 +0300 |
---|---|---|
committer | Alex Trotsenko <alex1973tr@gmail.com> | 2021-06-09 20:29:04 +0300 |
commit | 5b78d7fdcf9b758f117eaa65dc5eeddd0d4557e0 (patch) | |
tree | 8461b6d21a8c146a5e9e10d5d51385e1d790abff /src/network/socket/qlocalsocket_win.cpp | |
parent | c6c6e01e893b211f51511929b4258f789cdfd428 (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.cpp | 41 |
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)) |