diff options
| author | Alex Trotsenko <alex1973tr@gmail.com> | 2021-06-23 18:26:10 +0300 |
|---|---|---|
| committer | Alex Trotsenko <alex1973tr@gmail.com> | 2021-07-06 17:52:58 +0300 |
| commit | b3fbfcd3738a0ff864439499390513b95ca671aa (patch) | |
| tree | ac274d4652ea3415e9b0ef302c3c6bd146e15e4d /src/corelib/io/qwindowspipereader.cpp | |
| parent | 46d2ba1ea4d0e5f1a2ae1d1801e416e487ea45b4 (diff) | |
QLocalSocket: reimplement readLineData() function
The base implementation reads data using repeated calls to getChar(),
which is quite slow.
Change-Id: Ie46624df63791b2cdd3c8a28fe3327427d942505
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de>
Diffstat (limited to 'src/corelib/io/qwindowspipereader.cpp')
| -rw-r--r-- | src/corelib/io/qwindowspipereader.cpp | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/corelib/io/qwindowspipereader.cpp b/src/corelib/io/qwindowspipereader.cpp index 539902c2337..c3ac51df949 100644 --- a/src/corelib/io/qwindowspipereader.cpp +++ b/src/corelib/io/qwindowspipereader.cpp @@ -209,6 +209,30 @@ qint64 QWindowsPipeReader::read(char *data, qint64 maxlen) } /*! + Reads a line from the internal buffer, but no more than \c{maxlen} + characters. A terminating '\0' byte is always appended to \c{data}, + so \c{maxlen} must be larger than 1. + */ +qint64 QWindowsPipeReader::readLine(char *data, qint64 maxlen) +{ + QMutexLocker locker(&mutex); + qint64 readSoFar = 0; + + if (actualReadBufferSize > 0) { + readSoFar = readBuffer.readLine(data, qMin(actualReadBufferSize + 1, maxlen)); + actualReadBufferSize -= readSoFar; + } + + if (!pipeBroken) { + startAsyncReadHelper(&locker); + if (readSoFar == 0) + return -2; // signal EWOULDBLOCK + } + + return readSoFar; +} + +/*! Returns \c true if a complete line of data can be read from the buffer. */ bool QWindowsPipeReader::canReadLine() const |
