Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:15.5:Update
renderdoc.18053
0002-Don-t-call-ReadLargeBuffer-for-socket-read...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0002-Don-t-call-ReadLargeBuffer-for-socket-reads.patch of Package renderdoc.18053
From c61532a2f8f7638043c7bf64f1e95714045957ef Mon Sep 17 00:00:00 2001 From: baldurk <baldurk@baldurk.org> Date: Fri, 19 May 2023 09:58:49 +0100 Subject: [PATCH 2/5] Don't call ReadLargeBuffer for socket reads * In ReadLargeBuffer we read directly into an external buffer with ReadExternal, but for sockets when reading externally we want to read ahead of the current spot (non-blocking) as much as possible to batch small reads together. Rather than making ReadExternal handle or detect reads to external buffers, we instead avoid ReadLargeBuffer as it is an optimisation for direct I/O to avoid unnecessary memcpy's and is not relevant for sockets. --- renderdoc/serialise/streamio.cpp | 11 ++++++++++- renderdoc/serialise/streamio.h | 4 +++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/renderdoc/serialise/streamio.cpp b/renderdoc/serialise/streamio.cpp index 5669c2c01..ebddd33c8 100644 --- a/renderdoc/serialise/streamio.cpp +++ b/renderdoc/serialise/streamio.cpp @@ -270,7 +270,7 @@ bool StreamReader::Reserve(uint64_t numBytes) bool StreamReader::ReadLargeBuffer(void *buffer, uint64_t length) { - RDCASSERT(m_Sock || m_File || m_Decompressor); + RDCASSERT(m_File || m_Decompressor); byte *dest = (byte *)buffer; @@ -398,6 +398,9 @@ bool StreamReader::ReadFromExternal(void *buffer, uint64_t length) // first get the required data blocking (this will sleep the thread until it comes in). byte *readDest = (byte *)buffer; + // we expect to be reading into our window buffer + RDCASSERT(readDest >= m_BufferBase && readDest <= m_BufferBase + m_BufferSize); + success = m_Sock->RecvDataBlocking(readDest, (uint32_t)length); if(success) @@ -407,6 +410,12 @@ bool StreamReader::ReadFromExternal(void *buffer, uint64_t length) uint32_t bufSize = uint32_t(m_BufferSize - m_InputSize); + if(m_InputSize > m_BufferSize) + { + bufSize = 0; + RDCERR("Invalid read in ReadFromExternal!"); + } + // now read more, as much as possible, to try and batch future reads success = m_Sock->RecvDataNonBlocking(readDest, bufSize); diff --git a/renderdoc/serialise/streamio.h b/renderdoc/serialise/streamio.h index ec7b53a8a..8b296b876 100644 --- a/renderdoc/serialise/streamio.h +++ b/renderdoc/serialise/streamio.h @@ -180,7 +180,9 @@ public: // and larger by just skating over the limit each time, but that's fine because the main // case we want to catch is a window that's only a few MB and then suddenly we read 100s of // MB. - if(numBytes >= 10 * 1024 * 1024 && Available() + 128 < numBytes) + // We don't do this on sockets since we want to opportunistically read more into the window + // to batch lots of small reads together. + if(m_Sock == NULL && numBytes >= 10 * 1024 * 1024 && Available() + 128 < numBytes) { success = ReadLargeBuffer(data, numBytes); alreadyread = true; -- 2.41.0
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor