[Spice-devel] [PATCH 1/2] worker: move dcc_free_glz_drawable_instance

Frediano Ziglio fziglio at redhat.com
Fri Nov 20 02:09:48 PST 2015


> ACK
> 
> On Thu, 2015-11-19 at 17:59 +0000, Frediano Ziglio wrote:
> > From: Marc-André Lureau <marcandre.lureau at gmail.com>
> > 
> > ---
> >  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


More information about the Spice-devel mailing list