Skip to content

Commit

Permalink
Release unneeded memory more eagerly from conhost
Browse files Browse the repository at this point in the history
  • Loading branch information
lhecker committed Jul 20, 2021
1 parent 5a5902d commit 524effd
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 2 deletions.
8 changes: 8 additions & 0 deletions src/inc/til/u8u16convert.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,14 @@ namespace til // Terminal Implementation Library. Also: "Today I Learned"
RETURN_HR_IF(E_ABORT, !base::CheckAdd(in.length(), _partialsLen).AssignIfValid(&capacity));

_buffer.clear();

// If we were previously called with a huge buffer we have an equally large _buffer.
// We shouldn't just keep this huge size around, if no one needs it anymore.
if (_buffer.capacity() > 16 * 1024 && (_buffer.capacity() >> 1) > capacity)
{
_buffer.shrink_to_fit();
}

_buffer.reserve(capacity);

// copy UTF-8 code units that were remaining from the previous call (if any)
Expand Down
18 changes: 16 additions & 2 deletions src/server/ApiMessage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,14 @@ try
{
RETURN_HR_IF(E_FAIL, State.ReadOffset > Descriptor.InputSize);

ULONG const cbReadSize = Descriptor.InputSize - State.ReadOffset;
const ULONG cbReadSize = Descriptor.InputSize - State.ReadOffset;

// If we were previously called with a huge buffer we have an equally large _inputBuffer.
// We shouldn't just keep this huge size around, if no one needs it anymore.
if (_inputBuffer.capacity() > 16 * 1024 && (_inputBuffer.capacity() >> 1) > cbReadSize)
{
_inputBuffer.shrink_to_fit();
}

_inputBuffer.resize(cbReadSize);

Expand Down Expand Up @@ -145,10 +152,17 @@ try
ULONG cbWriteSize = Descriptor.OutputSize - State.WriteOffset;
RETURN_IF_FAILED(ULongMult(cbWriteSize, cbFactor, &cbWriteSize));

// If we were previously called with a huge buffer we have an equally large _outputBuffer.
// We shouldn't just keep this huge size around, if no one needs it anymore.
if (_outputBuffer.capacity() > 16 * 1024 && (_outputBuffer.capacity() >> 1) > cbWriteSize)
{
_outputBuffer.shrink_to_fit();
}

_outputBuffer.resize(cbWriteSize);

// 0 it out.
std::fill(_outputBuffer.begin(), _outputBuffer.end(), (BYTE)0);
std::fill_n(_outputBuffer.data(), _outputBuffer.size(), BYTE(0));

State.OutputBuffer = _outputBuffer.data();
State.OutputBufferSize = cbWriteSize;
Expand Down

0 comments on commit 524effd

Please sign in to comment.