simon-git: putty (main): Simon Tatham

Commits to Tartarus hosted VCS tartarus-commits at lists.tartarus.org
Sun Nov 20 15:10:11 GMT 2022


TL;DR:
  5f2eff2f Build option to disable scrollback compression.

Repository:     https://git.tartarus.org/simon/putty.git
On the web:     https://git.tartarus.org/?p=simon/putty.git
Branch updated: main
Committer:      Simon Tatham <anakin at pobox.com>
Date:           2022-11-20 15:10:11

commit 5f2eff2fea10642a445c90d377d816fa5cace3d4
web diff https://git.tartarus.org/?p=simon/putty.git;a=commitdiff;h=5f2eff2fea10642a445c90d377d816fa5cace3d4;hp=fec6719a2b7ac48372d8d44098a3b2938948fd2e
Author: Simon Tatham <anakin at pobox.com>
Date:   Sun Nov 20 10:55:33 2022 +0000

    Build option to disable scrollback compression.
    
    This was requested by a downstream of the code, who wanted to change
    the time/space tradeoff in the terminal. I currently have no plans to
    change this setting for upstream PuTTY, although there is a cmake
    option for it just to make testing it easy.
    
    To avoid sprinkling ifdefs over the whole terminal code, the strategy
    is to keep the separate type 'compressed_scrollback_line', and turn it
    into a typedef for a 'termline *'. So compressline() becomes almost
    trivial, and decompressline() even more so.
    
    Memory management is the fiddly part. To make this work sensibly on
    both sides, I've broken up each of compressline() and decompressline()
    into two versions, one of which takes ownership of (and logically
    speaking frees) its input, and the other doesn't. So at call sites
    where a function was followed by a free, it's now calling the
    'and_free' version of the function, and where the input object was
    reused afterwards, it's calling the 'no_free' version. This means that
    in different branches of the #if, I can make one function call the
    other or vice versa, and no call site is stuck with having to do
    things in a more roundabout way than necessary.
    
    The freeing of the _return_ value from decompressline() is handled for
    us, because termlines already have a 'temporary' flag which is set
    when they're returned from the decompressor, and anyone receiving a
    termline from lineptr() calls unlineptr() when they're finished with
    it, which will _conditionally_ free it, depending on that 'temporary'
    flag. So in the new mode, 'temporary' is never set at all, and all
    those unlineptr() calls do nothing.
    
    However, we also still need to free compressed lines properly when
    they're actually being thrown away (scrolled off the top of the
    scrollback, or cleaned up in term_free), and for that, I've made a new
    special-purpose free_compressed_line() function.

 cmake/cmake.h.in    |  1 +
 cmake/setup.cmake   |  9 +++++
 terminal/terminal.c | 97 +++++++++++++++++++++++++++++++++++++++++++++--------
 3 files changed, 93 insertions(+), 14 deletions(-)



More information about the tartarus-commits mailing list