[Spice-devel] [PATCH 1/2] worker: move dcc_free_glz_drawable_instance
Jonathon Jongsma
jjongsma at redhat.com
Thu Nov 19 13:38:33 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,
More information about the Spice-devel
mailing list