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, _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel