[Spice-devel] [PATCH 15/18] worker: move dcc_pixmap_cache_add
Frediano Ziglio
fziglio at redhat.com
Fri Nov 20 02:30:51 PST 2015
>
> On Wed, Nov 18, 2015 at 5:17 PM, Frediano Ziglio <fziglio at redhat.com> wrote:
> > From: Marc-André Lureau <marcandre.lureau at gmail.com>
> >
> > ---
> > server/dcc.c | 90
> > ++++++++++++++++++++++++++++++++++++++++++++++++++++
> > server/dcc.h | 2 ++
> > server/red_worker.c | 91
> > -----------------------------------------------------
> > 3 files changed, 92 insertions(+), 91 deletions(-)
> >
> > diff --git a/server/dcc.c b/server/dcc.c
> > index 7ba4c9f..bb6001e 100644
> > --- a/server/dcc.c
> > +++ b/server/dcc.c
> > @@ -942,3 +942,93 @@ void dcc_palette_cache_reset(DisplayChannelClient
> > *dcc)
> > {
> > red_palette_cache_reset(dcc, CLIENT_PALETTE_CACHE_SIZE);
> > }
> > +
> > +static void dcc_push_release(DisplayChannelClient *dcc, uint8_t type,
> > uint64_t id,
> > + uint64_t* sync_data)
> > +{
> > + FreeList *free_list = &dcc->send_data.free_list;
> > + int i;
> > +
> > + for (i = 0; i < MAX_CACHE_CLIENTS; i++) {
> > + free_list->sync[i] = MAX(free_list->sync[i], sync_data[i]);
> > + }
> > +
> > + if (free_list->res->count == free_list->res_size) {
> > + SpiceResourceList *new_list;
> > + new_list = spice_malloc(sizeof(*new_list) +
> > + free_list->res_size *
> > sizeof(SpiceResourceID) * 2);
> > + new_list->count = free_list->res->count;
> > + memcpy(new_list->resources, free_list->res->resources,
> > + new_list->count * sizeof(SpiceResourceID));
> > + free(free_list->res);
> > + free_list->res = new_list;
> > + free_list->res_size *= 2;
> > + }
> > + free_list->res->resources[free_list->res->count].type = type;
> > + free_list->res->resources[free_list->res->count++].id = id;
> > +}
> > +
> > +int dcc_pixmap_cache_unlocked_add(DisplayChannelClient *dcc, uint64_t id,
> > + uint32_t size, int lossy)
> > +{
> > + PixmapCache *cache = dcc->pixmap_cache;
> > + NewCacheItem *item;
> > + uint64_t serial;
> > + int key;
> > +
> > + spice_assert(size > 0);
> > +
> > + item = spice_new(NewCacheItem, 1);
> > + serial =
> > red_channel_client_get_message_serial(RED_CHANNEL_CLIENT(dcc));
> > +
> > + if (cache->generation != dcc->pixmap_cache_generation) {
> > + if (!dcc->pending_pixmaps_sync) {
> > + red_channel_client_pipe_add_type(
> > + RED_CHANNEL_CLIENT(dcc),
> > PIPE_ITEM_TYPE_PIXMAP_SYNC);
> > + dcc->pending_pixmaps_sync = TRUE;
> > + }
> > + free(item);
> > + return FALSE;
> > + }
> > +
> > + cache->available -= size;
> > + while (cache->available < 0) {
> > + NewCacheItem *tail;
> > + NewCacheItem **now;
> > +
> > + if (!(tail = (NewCacheItem *)ring_get_tail(&cache->lru)) ||
> > +
> > tail->sync[dcc->common.id]
> > == serial) {
> > + cache->available += size;
> > + free(item);
> > + return FALSE;
> > + }
> > +
> > + now = &cache->hash_table[BITS_CACHE_HASH_KEY(tail->id)];
> > + for (;;) {
> > + spice_assert(*now);
> > + if (*now == tail) {
> > + *now = tail->next;
> > + break;
> > + }
> > + now = &(*now)->next;
> > + }
> > + ring_remove(&tail->lru_link);
> > + cache->items--;
> > + cache->available += tail->size;
> > + cache->sync[dcc->common.id] = serial;
> > + dcc_push_release(dcc, SPICE_RES_TYPE_PIXMAP, tail->id,
> > tail->sync);
> > + free(tail);
> > + }
> > + ++cache->items;
> > + item->next = cache->hash_table[(key = BITS_CACHE_HASH_KEY(id))];
> > + cache->hash_table[key] = item;
> > + ring_item_init(&item->lru_link);
> > + ring_add(&cache->lru, &item->lru_link);
> > + item->id = id;
> > + item->size = size;
> > + item->lossy = lossy;
> > + memset(item->sync, 0, sizeof(item->sync));
> > + item->sync[dcc->common.id] = serial;
> > + cache->sync[dcc->common.id] = serial;
> > + return TRUE;
> > +}
> > diff --git a/server/dcc.h b/server/dcc.h
> > index 1b2c0a9..086f4fe 100644
> > --- a/server/dcc.h
> > +++ b/server/dcc.h
> > @@ -168,6 +168,8 @@ void dcc_palette_cache_reset
> > (DisplayCha
> > void dcc_palette_cache_palette
> > (DisplayChannelClient *dcc,
> > SpicePalette
> > *palette,
> > uint8_t
> > *flags);
> > +int dcc_pixmap_cache_unlocked_add
> > (DisplayChannelClient *dcc,
> > +
> > uint64_t
> > id, uint32_t size, int lossy);
> >
> > typedef struct compress_send_data_t {
> > void* comp_buf;
> > diff --git a/server/red_worker.c b/server/red_worker.c
> > index 1c54d51..aab3c73 100644
> > --- a/server/red_worker.c
> > +++ b/server/red_worker.c
> > @@ -183,8 +183,6 @@ static void red_update_area_till(DisplayChannel
> > *display, const SpiceRect *area,
> > Drawable *last);
> > static inline void display_begin_send_message(RedChannelClient *rcc);
> > static void dcc_release_glz(DisplayChannelClient *dcc);
> > -static void display_channel_push_release(DisplayChannelClient *dcc,
> > uint8_t type, uint64_t id,
> > - uint64_t* sync_data);
> > static int
> > red_display_free_some_independent_glz_drawables(DisplayChannelClient
> > *dcc);
> > static void
> > display_channel_client_release_item_before_push(DisplayChannelClient
> > *dcc,
> > PipeItem
> > *item);
> > @@ -2029,70 +2027,6 @@ static int
> > red_display_free_some_independent_glz_drawables(DisplayChannelClient
> > return n;
> > }
> >
> > -int dcc_pixmap_cache_unlocked_add(DisplayChannelClient *dcc, uint64_t id,
> > uint32_t size, int lossy)
> > -{
> > - PixmapCache *cache = dcc->pixmap_cache;
> > - NewCacheItem *item;
> > - uint64_t serial;
> > - int key;
> > -
> > - spice_assert(size > 0);
> > -
> > - item = spice_new(NewCacheItem, 1);
> > - serial =
> > red_channel_client_get_message_serial(RED_CHANNEL_CLIENT(dcc));
> > -
> > - if (cache->generation != dcc->pixmap_cache_generation) {
> > - if (!dcc->pending_pixmaps_sync) {
> > - red_channel_client_pipe_add_type(
> > - RED_CHANNEL_CLIENT(dcc),
> > PIPE_ITEM_TYPE_PIXMAP_SYNC);
> > - dcc->pending_pixmaps_sync = TRUE;
> > - }
> > - free(item);
> > - return FALSE;
> > - }
> > -
> > - cache->available -= size;
> > - while (cache->available < 0) {
> > - NewCacheItem *tail;
> > - NewCacheItem **now;
> > -
> > - if (!(tail = (NewCacheItem *)ring_get_tail(&cache->lru)) ||
> > -
> > tail->sync[dcc->common.id]
> > == serial) {
> > - cache->available += size;
> > - free(item);
> > - return FALSE;
> > - }
> > -
> > - now = &cache->hash_table[BITS_CACHE_HASH_KEY(tail->id)];
> > - for (;;) {
> > - spice_assert(*now);
> > - if (*now == tail) {
> > - *now = tail->next;
> > - break;
> > - }
> > - now = &(*now)->next;
> > - }
> > - ring_remove(&tail->lru_link);
> > - cache->items--;
> > - cache->available += tail->size;
> > - cache->sync[dcc->common.id] = serial;
> > - display_channel_push_release(dcc, SPICE_RES_TYPE_PIXMAP, tail->id,
> > tail->sync);
> > - free(tail);
> > - }
> > - ++cache->items;
> > - item->next = cache->hash_table[(key = BITS_CACHE_HASH_KEY(id))];
> > - cache->hash_table[key] = item;
> > - ring_item_init(&item->lru_link);
> > - ring_add(&cache->lru, &item->lru_link);
> > - item->id = id;
> > - item->size = size;
> > - item->lossy = lossy;
> > - memset(item->sync, 0, sizeof(item->sync));
> > - item->sync[dcc->common.id] = serial;
> > - cache->sync[dcc->common.id] = serial;
> > - return TRUE;
> > -}
> > -
> > static inline void red_display_add_image_to_pixmap_cache(RedChannelClient
> > *rcc,
> > SpiceImage
> > *image,
> > SpiceImage
> > *io_image,
> > int is_lossy)
> > @@ -3699,31 +3633,6 @@ static inline void
> > red_marshall_qxl_drawable(RedChannelClient *rcc,
> > }
> > }
> >
> > -static void display_channel_push_release(DisplayChannelClient *dcc,
> > uint8_t type, uint64_t id,
> > - uint64_t* sync_data)
> > -{
> > - FreeList *free_list = &dcc->send_data.free_list;
> > - int i;
> > -
> > - for (i = 0; i < MAX_CACHE_CLIENTS; i++) {
> > - free_list->sync[i] = MAX(free_list->sync[i], sync_data[i]);
> > - }
> > -
> > - if (free_list->res->count == free_list->res_size) {
> > - SpiceResourceList *new_list;
> > - new_list = spice_malloc(sizeof(*new_list) +
> > - free_list->res_size *
> > sizeof(SpiceResourceID) * 2);
> > - new_list->count = free_list->res->count;
> > - memcpy(new_list->resources, free_list->res->resources,
> > - new_list->count * sizeof(SpiceResourceID));
> > - free(free_list->res);
> > - free_list->res = new_list;
> > - free_list->res_size *= 2;
> > - }
> > - free_list->res->resources[free_list->res->count].type = type;
> > - free_list->res->resources[free_list->res->count++].id = id;
> > -}
> > -
> > static inline void display_marshal_sub_msg_inval_list(SpiceMarshaller *m,
> > FreeList
> > *free_list)
> > {
> > --
> > 2.4.3
> >
> > _______________________________________________
> > Spice-devel mailing list
> > Spice-devel at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/spice-devel
>
> Seems good, ACK!
>
> --
> Fabiano FidĂȘncio
>
Merged
Frediano
More information about the Spice-devel
mailing list