diff options
Diffstat (limited to 'server/image-encoders.c')
-rw-r--r-- | server/image-encoders.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/server/image-encoders.c b/server/image-encoders.c index ec9abe82..7415c40d 100644 --- a/server/image-encoders.c +++ b/server/image-encoders.c @@ -55,7 +55,8 @@ struct GlzContext { //struct DisplayChannel *dc; ImageEncoderSharedData *shared; /** hold a reference to this object */ - RedDrawable *red_drawable; + RedDrawable *red_drawable_; + Drawable *drawable; }; static void encoder_data_init(EncoderData *data); @@ -363,14 +364,15 @@ static void image_encoders_init_lz(ImageEncoders *enc) static void glz_usr_free_image(GlzEncoderUsrContext *usr, GlzUsrImageContext *image) { - printf("Glz free image called\n"); GlzData *lz_data = (GlzData *)usr; GlzContext *glz_context = (GlzContext*) image; ImageEncoderSharedData *drawable_shared = glz_context->shared; ImageEncoders *this_enc = SPICE_CONTAINEROF(lz_data, ImageEncoders, glz_data); if (this_enc->shared_data == drawable_shared || drawable_shared == NULL) { + printf("Glz free image called - freeing, from %p\n", drawable_shared); dcc_free_glz_context(glz_context); } else { + printf("Glz free image called - appending to %p\n", drawable_shared); /* The glz dictionary is shared between all DisplayChannelClient * instances that belong to the same client, and glz_usr_free_image * can be called by the dictionary code @@ -503,7 +505,8 @@ static void dcc_free_glz_context(GlzContext *instance) ring_remove(&instance->free_link); } - red_drawable_unref(instance->red_drawable); + red_drawable_unref(instance->red_drawable_); + drawable_unref(instance->drawable); if (shared) shared->glz_drawable_count--; g_atomic_int_dec_and_test(&glz_contextes_global_count); @@ -1017,13 +1020,16 @@ int image_encoders_compress_lz4(ImageEncoders *enc, SpiceImage *dest, gint glz_contextes_global_count = 0; /* allocates new instance and adds it to instances in the given drawable. NOTE - the caller should set the glz_instance returned by the encoder by itself.*/ -static GlzContext *glz_context_new(ImageEncoders *enc, RedDrawable *red_drawable) +static GlzContext *glz_context_new(ImageEncoders *enc, Drawable *drawable) { GlzContext *ret = spice_new0(GlzContext, 1); + ring_item_init(&ret->glz_context_link); ring_item_init(&ret->free_link); ret->context = NULL; ret->shared = enc->shared_data; - ret->red_drawable = red_drawable_ref(red_drawable); + ret->red_drawable_ = red_drawable_ref(drawable->red_drawable); + ret->drawable = drawable; + drawable->refs++; g_atomic_int_inc(&glz_contextes_global_count); return ret; |