qnativesocketengine_win.cpp: Improve memory handling
We use std::vector and thus RAII instead of manual memory management. std::vector (re)allocates only if needed, growing exponentially, initializing only new elements. std::vector<>::resize also makes initialization loop redundant Task-number: QTBUG-71156 Change-Id: I253bb428c0fb641872f0f7f2dcfe1f9e89db0296 Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io> Reviewed-by: Mikhail Svetkin <mikhail.svetkin@qt.io> Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>bb10
parent
d3fe78f6c4
commit
97d12b4541
|
|
@ -1146,22 +1146,17 @@ qint64 QNativeSocketEnginePrivate::nativePendingDatagramSize() const
|
|||
qint64 ret = -1;
|
||||
int recvResult = 0;
|
||||
DWORD flags;
|
||||
DWORD bufferCount = 5;
|
||||
WSABUF * buf = 0;
|
||||
// We start at 1500 bytes (the MTU for Ethernet V2), which should catch
|
||||
// almost all uses (effective MTU for UDP under IPv4 is 1468), except
|
||||
// for localhost datagrams and those reassembled by the IP layer.
|
||||
char udpMessagePeekBuffer[1500];
|
||||
std::vector<WSABUF> buf;
|
||||
for (;;) {
|
||||
// We start at 1500 bytes (the MTU for Ethernet V2), which should catch
|
||||
// almost all uses (effective MTU for UDP under IPv4 is 1468), except
|
||||
// for localhost datagrams and those reassembled by the IP layer.
|
||||
char udpMessagePeekBuffer[1500];
|
||||
buf.resize(buf.size() + 5, {sizeof(udpMessagePeekBuffer), udpMessagePeekBuffer});
|
||||
|
||||
buf = new WSABUF[bufferCount];
|
||||
for (DWORD i=0; i<bufferCount; i++) {
|
||||
buf[i].buf = udpMessagePeekBuffer;
|
||||
buf[i].len = sizeof(udpMessagePeekBuffer);
|
||||
}
|
||||
flags = MSG_PEEK;
|
||||
DWORD bytesRead = 0;
|
||||
recvResult = ::WSARecv(socketDescriptor, buf, bufferCount, &bytesRead, &flags, 0,0);
|
||||
recvResult = ::WSARecv(socketDescriptor, buf.data(), DWORD(buf.size()), &bytesRead, &flags, nullptr, nullptr);
|
||||
int err = WSAGetLastError();
|
||||
if (recvResult != SOCKET_ERROR) {
|
||||
ret = qint64(bytesRead);
|
||||
|
|
@ -1169,8 +1164,6 @@ qint64 QNativeSocketEnginePrivate::nativePendingDatagramSize() const
|
|||
} else {
|
||||
switch (err) {
|
||||
case WSAEMSGSIZE:
|
||||
bufferCount += 5;
|
||||
delete[] buf;
|
||||
continue;
|
||||
case WSAECONNRESET:
|
||||
case WSAENETRESET:
|
||||
|
|
@ -1185,9 +1178,6 @@ qint64 QNativeSocketEnginePrivate::nativePendingDatagramSize() const
|
|||
}
|
||||
}
|
||||
|
||||
if (buf)
|
||||
delete[] buf;
|
||||
|
||||
#if defined (QNATIVESOCKETENGINE_DEBUG)
|
||||
qDebug("QNativeSocketEnginePrivate::nativePendingDatagramSize() == %lli", ret);
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Reference in New Issue