Browse Source

Merge pull request #19208 from Chocobo1/buffer

Avoid unnecessary memory allocation/relocation
adaptive-webui-19844
Chocobo1 1 year ago committed by GitHub
parent
commit
dffb93a6aa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 19
      src/base/http/connection.cpp
  2. 2
      src/base/http/requestparser.cpp
  3. 2
      src/base/net/smtp.cpp
  4. 2
      src/base/path.cpp

19
src/base/http/connection.cpp

@ -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;

2
src/base/http/requestparser.cpp

@ -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())

2
src/base/net/smtp.cpp

@ -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);

2
src/base/path.cpp

@ -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…
Cancel
Save