[Spice-devel] [PATCH spice-gtk 2/3] decode-glz: Handle needing glz images before they have arrived
Marc-André Lureau
mlureau at redhat.com
Fri Oct 7 05:37:37 PDT 2011
ack
----- Original Message -----
> With multi monitor guests, it is possible for a glz-image to refer to
> bits from another glz-image which has not arrived yet! This can
> happen
> because each monitor has its own display channel, and thus its own
> socket,
> but they share the glz dict. Thus things can arrive out of order,
> with a
> glz-image on display 1 arriving before the glz-image on display 2
> which it
> refers too.
>
> This triggers the:
> g_return_val_if_fail(w->images[slot]->hdr.id == id - dist, NULL);
>
> In glz_decoder_window_bits(), which is what caused me to debug this,
> once
> the out order thing was clear, so was the fix.
> If w->images[slot]->hdr.id == id - dist is not true, we need to wait
> for the
> correct image to arrive.
>
> The out of order issue with multiple monitors can also trigger the
> g_warn_if_reached() in glz_decoder_window_resize(), so remove that.
>
> Signed-off-by: Hans de Goede <hdegoede at redhat.com>
> ---
> gtk/decode-glz.c | 21 ++++++++++++---------
> 1 files changed, 12 insertions(+), 9 deletions(-)
>
> diff --git a/gtk/decode-glz.c b/gtk/decode-glz.c
> index 8ddb9d8..317fa9e 100644
> --- a/gtk/decode-glz.c
> +++ b/gtk/decode-glz.c
> @@ -95,8 +95,12 @@ static void
> glz_decoder_window_resize(SpiceGlzDecoderWindow *w)
> new_images = spice_new0(struct glz_image*, w->nimages * 2);
> for (i = 0; i < w->nimages; i++) {
> if (w->images[i] == NULL) {
> - /* FIXME: is this really an anormal condition? */
> - g_warn_if_reached();
> + /*
> + * We can have empty slots when images come in out of
> order, this
> + * can happen when a vm has multiple displays, since
> each display
> + * uses its own socket there is no guarantee that images
> + * originating from different displays are received in
> id order.
> + */
> continue;
> }
> new_slot = w->images[i]->hdr.id % (w->nimages * 2);
> @@ -124,14 +128,14 @@ static void
> glz_decoder_window_add(SpiceGlzDecoderWindow *w,
> struct wait_for_image_data {
> SpiceGlzDecoderWindow *window;
> uint64_t id;
> - uint32_t dist;
> };
>
> static gboolean wait_for_image(gpointer data)
> {
> struct wait_for_image_data *wait = data;
> - int slot = (wait->id - wait->dist) % wait->window->nimages;
> - gboolean ready = wait->window->images[slot] != NULL;
> + int slot = wait->id % wait->window->nimages;
> + struct glz_image *image = wait->window->images[slot];
> + gboolean ready = image && image->hdr.id == wait->id;
>
> SPICE_DEBUG("image with slot %d: %s", slot, ready ? "yes" :
> "no");
>
> @@ -142,12 +146,11 @@ static void
> *glz_decoder_window_bits(SpiceGlzDecoderWindow *w, uint64_t id,
> uint32_t dist, uint32_t offset)
> {
> int slot = (id - dist) % w->nimages;
> -
> - if (!w->images[slot]) {
> +
> + if (!w->images[slot] || w->images[slot]->hdr.id != id - dist) {
> struct wait_for_image_data data = {
> .window = w,
> - .id = id,
> - .dist = dist,
> + .id = id - dist,
> };
>
> g_condition_wait(wait_for_image, &data);
> --
> 1.7.6.4
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
>
More information about the Spice-devel
mailing list