Skip to content
  • Manuel Stoeckl's avatar
    connection: Dynamically resize connection buffers · d074d529
    Manuel Stoeckl authored and Simon Ser's avatar Simon Ser committed
    
    
    When using fixed size connection buffers, if either the client or the
    server is sending requests faster than the other end can cope with, the
    connection buffers will fill up, eventually killing the connection.
    
    This can be a problem for example with Xwayland mapping a lot of
    windows, faster than the Wayland compositor can cope with, or a
    high-rate mouse flooding the Wayland client with pointer events.
    
    To avoid the issue, resize the connection buffers dynamically when they
    get full.
    
    Both data and fd buffers are resized on demand.
    
    The default max buffer size is controlled via the wl_display interface
    while each client's connection buffer size is adjustable for finer
    control.
    
    The purpose is to explicitly have larger connection buffers for specific
    clients such as Xwayland, or set a larger buffer size for the client
    with pointer focus to deal with a higher input events rate.
    
    v0: Manuel:
       Dynamically resize connection buffers - Both data and fd buffers are
       resized on demand.
    v1: Olivier
    1. Add support for unbounded buffers on the client side and growable
       (yet limited) connection buffers on the server side.
    2. Add the API to set the default maximum size and a limit for a given
       client.
    3. Add tests for growable connection buffers and adjustable limits.
    v2: Additional fixes by John:
    1. Fix the size calculation in ring_buffer_check_space()
    2. Fix wl_connection_read() to return gracefully once it has read up to
       the max buffer size, rather than returning an error.
    3. If wl_connection_flush() fails with EAGAIN but the transmit
       ring-buffer has space remaining (or can be expanded),
       wl_connection_queue() should store the message rather than
       returning an error.
    4. When the receive ring-buffer is at capacity but more data is
       available to be read, wl_connection_read() should attempt to
       expand the ring-buffer in order to read the remaining data.
    v3: Thomas Lukaszewicz <tluk@chromium.org>
       Add a test for unbounded buffers
    v4: Add a client API as well to force bounded buffers (unbounded
        by default (Olivier)
    v5: Simplify ring_buffer_ensure_space() (Sebastian)
    
    Co-authored-by: default avatarOlivier Fourdan <ofourdan@redhat.com>
    Co-authored-by: default avatarJohn Lindgren <john@jlindgren.net>
    Co-authored-by: default avatarSebastian Wick <sebastian@sebastianwick.net>
    Signed-off-by: default avatarManuel Stoeckl <code@mstoeckl.com>
    Signed-off-by: default avatarOlivier Fourdan <ofourdan@redhat.com>
    Signed-off-by: default avatarJohn Lindgren <john@jlindgren.net>
    Signed-off-by: default avatarSebastian Wick <sebastian@sebastianwick.net>
    Closes: #237
    d074d529