> ACK > > On Thu, 2015-11-19 at 17:59 +0000, Frediano Ziglio wrote: > > From: Marc-André Lureau <marcandre.lureau@xxxxxxxxx> > > > > --- > > server/dcc-encoders.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ > > server/red_worker.c | 50 > > ++------------------------------------------------ > > server/red_worker.h | 3 +++ > > 3 files changed, 52 insertions(+), 48 deletions(-) > > > > diff --git a/server/dcc-encoders.c b/server/dcc-encoders.c > > index 90d0ce0..1f98d1a 100644 > > --- a/server/dcc-encoders.c > > +++ b/server/dcc-encoders.c > > @@ -425,3 +425,50 @@ void marshaller_add_compressed(SpiceMarshaller *m, > > comp_buf = comp_buf->send_next; > > } while (max); > > } > > + > > +/* Remove from the to_free list and the instances_list. > > + When no instance is left - the RedGlzDrawable is released too. (and the > > qxl drawable too, if > > + it is not used by Drawable). > > + NOTE - 1) can be called only by the display channel that created the > > drawable > > + 2) it is assumed that the instance was already removed from the > > dictionary*/ > > +void dcc_free_glz_drawable_instance(DisplayChannelClient *dcc, > > + GlzDrawableInstanceItem *instance) > > +{ > > + DisplayChannel *display_channel = DCC_TO_DC(dcc); > > + RedWorker *worker = display_channel->common.worker; > > + RedGlzDrawable *glz_drawable; > > + > > + spice_assert(instance); > > + spice_assert(instance->glz_drawable); > > + > > + glz_drawable = instance->glz_drawable; > > + > > + spice_assert(glz_drawable->dcc == dcc); > > + spice_assert(glz_drawable->instances_count > 0); > > + > > + ring_remove(&instance->glz_link); > > + glz_drawable->instances_count--; > > + > > + // when the remove callback is performed from the channel that the > > + // drawable belongs to, the instance is not added to the 'to_free' > > list > > + if (ring_item_is_linked(&instance->free_link)) { > > + ring_remove(&instance->free_link); > > + } > > + > > + if (ring_is_empty(&glz_drawable->instances)) { > > + spice_assert(glz_drawable->instances_count == 0); > > + > > + Drawable *drawable = glz_drawable->drawable; > > + > > + if (drawable) { > > + ring_remove(&glz_drawable->drawable_link); > > + } > > + red_drawable_unref(worker, glz_drawable->red_drawable, > > + glz_drawable->group_id); > > + display_channel->glz_drawable_count--; > > + if (ring_item_is_linked(&glz_drawable->link)) { > > + ring_remove(&glz_drawable->link); > > + } > > + free(glz_drawable); > > + } > > +} > > diff --git a/server/red_worker.c b/server/red_worker.c > > index 3a21d96..633d5d4 100644 > > --- a/server/red_worker.c > > +++ b/server/red_worker.c > > @@ -571,8 +571,8 @@ static inline void > > set_surface_release_info(QXLReleaseInfoExt *release_info_ext, > > release_info_ext->group_id = group_id; > > } > > > > -static void red_drawable_unref(RedWorker *worker, RedDrawable > > *red_drawable, > > - uint32_t group_id) > > +void red_drawable_unref(RedWorker *worker, RedDrawable *red_drawable, > > + uint32_t group_id) > > { > > QXLReleaseInfoExt release_info_ext; > > > > @@ -2004,52 +2004,6 @@ static void fill_base(SpiceMarshaller > > *base_marshaller, > > Drawable *drawable) > > spice_marshall_DisplayBase(base_marshaller, &base); > > } > > > > -/* Remove from the to_free list and the instances_list. > > - When no instance is left - the RedGlzDrawable is released too. (and the > > qxl drawable too, if > > - it is not used by Drawable). > > - NOTE - 1) can be called only by the display channel that created the > > drawable > > - 2) it is assumed that the instance was already removed from the > > dictionary*/ > > -void dcc_free_glz_drawable_instance(DisplayChannelClient *dcc, > > - GlzDrawableInstanceItem > > *glz_drawable_instance) > > -{ > > - DisplayChannel *display_channel = DCC_TO_DC(dcc); > > - RedWorker *worker = display_channel->common.worker; > > - RedGlzDrawable *glz_drawable; > > - > > - spice_assert(glz_drawable_instance); > > - spice_assert(glz_drawable_instance->glz_drawable); > > - > > - glz_drawable = glz_drawable_instance->glz_drawable; > > - > > - spice_assert(glz_drawable->dcc == dcc); > > - spice_assert(glz_drawable->instances_count); > > - > > - ring_remove(&glz_drawable_instance->glz_link); > > - glz_drawable->instances_count--; > > - // when the remove callback is performed from the channel that the > > - // drawable belongs to, the instance is not added to the 'to_free' > > list > > - if (ring_item_is_linked(&glz_drawable_instance->free_link)) { > > - ring_remove(&glz_drawable_instance->free_link); > > - } > > - > > - if (ring_is_empty(&glz_drawable->instances)) { > > - spice_assert(!glz_drawable->instances_count); > > - > > - Drawable *drawable = glz_drawable->drawable; > > - > > - if (drawable) { > > - ring_remove(&glz_drawable->drawable_link); > > - } > > - red_drawable_unref(worker, glz_drawable->red_drawable, > > - glz_drawable->group_id); > > - display_channel->glz_drawable_count--; > > - if (ring_item_is_linked(&glz_drawable->link)) { > > - ring_remove(&glz_drawable->link); > > - } > > - free(glz_drawable); > > - } > > -} > > - > > static void red_display_handle_glz_drawables_to_free(DisplayChannelClient* > > dcc) > > { > > RingItem *ring_link; > > diff --git a/server/red_worker.h b/server/red_worker.h > > index 729ce2b..cbf91b9 100644 > > --- a/server/red_worker.h > > +++ b/server/red_worker.h > > @@ -22,6 +22,7 @@ > > #include <errno.h> > > #include "red_common.h" > > #include "red_dispatcher.h" > > +#include "red_parse_qxl.h" > > > > typedef struct RedWorker RedWorker; > > > > @@ -109,6 +110,8 @@ QXLInstance* red_worker_get_qxl(RedWorker *worker); > > RedChannel* red_worker_get_cursor_channel(RedWorker *worker); > > RedChannel* red_worker_get_display_channel(RedWorker *worker); > > clockid_t red_worker_get_clockid(RedWorker *worker); > > +void red_drawable_unref(RedWorker *worker, RedDrawable *red_drawable, > > + uint32_t group_id); > > > > RedChannel *red_worker_new_channel(RedWorker *worker, int size, > > const char *name, > Merged Frediano _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel