From 7bf81286bdbde02b6c7ceaf62346e7b236caa9c5 Mon Sep 17 00:00:00 2001 From: Alex Trotsenko Date: Mon, 31 Oct 2016 16:40:19 +0200 Subject: [PATCH] QSocks5SocketEngine: improve buffering in CONNECT mode Replace QByteArray-based read buffer with a more efficient QRingBuffer. Change-Id: Id43427a0692463481dfc4dfbe915772afb093364 Reviewed-by: Jesus Fernandez Reviewed-by: Timur Pocheptsov Reviewed-by: Edward Welbourne --- src/network/socket/qsocks5socketengine.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/network/socket/qsocks5socketengine.cpp b/src/network/socket/qsocks5socketengine.cpp index a1a8e4649d..89261ce789 100644 --- a/src/network/socket/qsocks5socketengine.cpp +++ b/src/network/socket/qsocks5socketengine.cpp @@ -54,6 +54,7 @@ #include "qurl.h" #include "qauthenticator.h" #include "private/qiodevice_p.h" +#include "private/qringbuffer_p.h" #include #include @@ -280,7 +281,7 @@ struct QSocks5Data struct QSocks5ConnectData : public QSocks5Data { - QByteArray readBuffer; + QRingBuffer readBuffer; }; struct QSocks5BindData : public QSocks5Data @@ -1193,7 +1194,7 @@ void QSocks5SocketEnginePrivate::_q_controlSocketReadNotification() } if (buf.size()) { QSOCKS5_DEBUG << dump(buf); - connectData->readBuffer += buf; + connectData->readBuffer.append(buf); emitReadNotification(); } break; @@ -1513,7 +1514,7 @@ qint64 QSocks5SocketEngine::read(char *data, qint64 maxlen) Q_D(QSocks5SocketEngine); QSOCKS5_Q_DEBUG << "read( , maxlen = " << maxlen << ')'; if (d->mode == QSocks5SocketEnginePrivate::ConnectMode) { - if (d->connectData->readBuffer.size() == 0) { + if (d->connectData->readBuffer.isEmpty()) { if (d->data->controlSocket->state() == QAbstractSocket::UnconnectedState) { //imitate remote closed close(); @@ -1525,9 +1526,7 @@ qint64 QSocks5SocketEngine::read(char *data, qint64 maxlen) return 0; // nothing to be read } } - qint64 copy = qMin(d->connectData->readBuffer.size(), maxlen); - memcpy(data, d->connectData->readBuffer.constData(), copy); - d->connectData->readBuffer.remove(0, copy); + const qint64 copy = d->connectData->readBuffer.read(data, maxlen); QSOCKS5_DEBUG << "read" << dump(QByteArray(data, copy)); return copy; #ifndef QT_NO_UDPSOCKET