Commit 0bad8342 authored by Daniel P. Berrangé's avatar Daniel P. Berrangé Committed by Gerd Hoffmann
Browse files

ui: refactor code for determining if an update should be sent to the client



The logic for determining if it is possible to send an update to the client
will become more complicated shortly, so pull it out into a separate method
for easier extension later.

Signed-off-by: default avatarDaniel P. Berrange <berrange@redhat.com>
Reviewed-by: default avatarDarren Kenny <darren.kenny@oracle.com>
Reviewed-by: default avatarMarc-André Lureau <marcandre.lureau@redhat.com>
Message-id: 20171218191228.31018-9-berrange@redhat.com
Signed-off-by: default avatarGerd Hoffmann <kraxel@redhat.com>
parent 728a7ac9
Loading
Loading
Loading
Loading
+20 −7
Original line number Diff line number Diff line
@@ -961,6 +961,25 @@ static int find_and_clear_dirty_height(VncState *vs,
    return h;
}

static bool vnc_should_update(VncState *vs)
{
    switch (vs->update) {
    case VNC_STATE_UPDATE_NONE:
        break;
    case VNC_STATE_UPDATE_INCREMENTAL:
        /* Only allow incremental updates if the output buffer
         * is empty, or if audio capture is enabled.
         */
        if (!vs->output.offset || vs->audio_cap) {
            return true;
        }
        break;
    case VNC_STATE_UPDATE_FORCE:
        return true;
    }
    return false;
}

static int vnc_update_client(VncState *vs, int has_dirty)
{
    VncDisplay *vd = vs->vd;
@@ -975,13 +994,7 @@ static int vnc_update_client(VncState *vs, int has_dirty)
    }

    vs->has_dirty += has_dirty;
    if (vs->update == VNC_STATE_UPDATE_NONE) {
        return 0;
    }

    if (vs->output.offset && !vs->audio_cap &&
        vs->update != VNC_STATE_UPDATE_FORCE) {
        /* kernel send buffers are full -> drop frames to throttle */
    if (!vnc_should_update(vs)) {
        return 0;
    }