mirror of
https://github.com/d47081/qBittorrent.git
synced 2025-01-22 12:34:19 +00:00
Merge pull request #19208 from Chocobo1/buffer
Avoid unnecessary memory allocation/relocation
This commit is contained in:
commit
dffb93a6aa
@ -46,6 +46,10 @@ Connection::Connection(QTcpSocket *socket, IRequestHandler *requestHandler, QObj
|
|||||||
{
|
{
|
||||||
m_socket->setParent(this);
|
m_socket->setParent(this);
|
||||||
|
|
||||||
|
// reserve common size for requests, don't use the max allowed size which is too big for
|
||||||
|
// memory constrained platforms
|
||||||
|
m_receivedData.reserve(1024 * 1024);
|
||||||
|
|
||||||
// reset timer when there are activity
|
// reset timer when there are activity
|
||||||
m_idleTimer.start();
|
m_idleTimer.start();
|
||||||
connect(m_socket, &QIODevice::readyRead, this, [this]()
|
connect(m_socket, &QIODevice::readyRead, this, [this]()
|
||||||
@ -66,7 +70,18 @@ Connection::~Connection()
|
|||||||
|
|
||||||
void Connection::read()
|
void Connection::read()
|
||||||
{
|
{
|
||||||
m_receivedData.append(m_socket->readAll());
|
// reuse existing buffer and avoid unnecessary memory allocation/relocation
|
||||||
|
const qsizetype previousSize = m_receivedData.size();
|
||||||
|
const qint64 bytesAvailable = m_socket->bytesAvailable();
|
||||||
|
m_receivedData.resize(previousSize + bytesAvailable);
|
||||||
|
const qint64 bytesRead = m_socket->read((m_receivedData.data() + previousSize), bytesAvailable);
|
||||||
|
if (Q_UNLIKELY(bytesRead < 0))
|
||||||
|
{
|
||||||
|
m_socket->close();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (Q_UNLIKELY(bytesRead < bytesAvailable))
|
||||||
|
m_receivedData.chop(bytesAvailable - bytesRead);
|
||||||
|
|
||||||
while (!m_receivedData.isEmpty())
|
while (!m_receivedData.isEmpty())
|
||||||
{
|
{
|
||||||
@ -116,7 +131,7 @@ void Connection::read()
|
|||||||
resp.headers[HEADER_CONNECTION] = u"keep-alive"_s;
|
resp.headers[HEADER_CONNECTION] = u"keep-alive"_s;
|
||||||
|
|
||||||
sendResponse(resp);
|
sendResponse(resp);
|
||||||
m_receivedData = m_receivedData.mid(result.frameSize);
|
m_receivedData.remove(0, result.frameSize);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -189,7 +189,7 @@ bool RequestParser::parseRequestLine(const QString &line)
|
|||||||
{
|
{
|
||||||
// [rfc7230] 3.1.1. Request Line
|
// [rfc7230] 3.1.1. Request Line
|
||||||
|
|
||||||
const QRegularExpression re(u"^([A-Z]+)\\s+(\\S+)\\s+HTTP\\/(\\d\\.\\d)$"_s);
|
static const QRegularExpression re(u"^([A-Z]+)\\s+(\\S+)\\s+HTTP\\/(\\d\\.\\d)$"_s);
|
||||||
const QRegularExpressionMatch match = re.match(line);
|
const QRegularExpressionMatch match = re.match(line);
|
||||||
|
|
||||||
if (!match.hasMatch())
|
if (!match.hasMatch())
|
||||||
|
@ -191,7 +191,7 @@ void Smtp::readyRead()
|
|||||||
const int pos = m_buffer.indexOf("\r\n");
|
const int pos = m_buffer.indexOf("\r\n");
|
||||||
if (pos < 0) return; // Loop exit condition
|
if (pos < 0) return; // Loop exit condition
|
||||||
const QByteArray line = m_buffer.left(pos);
|
const QByteArray line = m_buffer.left(pos);
|
||||||
m_buffer = m_buffer.mid(pos + 2);
|
m_buffer.remove(0, (pos + 2));
|
||||||
qDebug() << "Response line:" << line;
|
qDebug() << "Response line:" << line;
|
||||||
// Extract response code
|
// Extract response code
|
||||||
const QByteArray code = line.left(3);
|
const QByteArray code = line.left(3);
|
||||||
|
@ -318,7 +318,7 @@ void Path::stripRootFolder(PathList &filePaths)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
for (Path &filePath : filePaths)
|
for (Path &filePath : filePaths)
|
||||||
filePath.m_pathStr = filePath.m_pathStr.mid(commonRootFolder.m_pathStr.size() + 1);
|
filePath.m_pathStr.remove(0, (commonRootFolder.m_pathStr.size() + 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Path::addRootFolder(PathList &filePaths, const Path &rootFolder)
|
void Path::addRootFolder(PathList &filePaths, const Path &rootFolder)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user