On Wed, Nov 18, 2015 at 5:17 PM, Frediano Ziglio <fziglio@xxxxxxxxxx> 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..305d17e 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_return_if_fail(instance); > + spice_return_if_fail(instance->glz_drawable); Silently changed the spice_assert() to spice_return_if_fail() > + > + glz_drawable = instance->glz_drawable; > + > + spice_return_if_fail(glz_drawable->dcc == dcc); > + spice_return_if_fail(glz_drawable->instances_count > 0); Same here ... > + > + 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_return_if_fail(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); > + dcc->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 9231ab5..9318a43 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; > > @@ -2006,52 +2006,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); > - dcc->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 c64dcaf..063840d 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" > > #define NUM_SURFACES 10000 > > @@ -111,6 +112,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, > -- > 2.4.3 > > _______________________________________________ > Spice-devel mailing list > Spice-devel@xxxxxxxxxxxxxxxxxxxxx > http://lists.freedesktop.org/mailman/listinfo/spice-devel Apart from the comments, looks good. ACK. -- Fabiano Fidêncio _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel