From: Marc-André Lureau <marcandre.lureau@xxxxxxxxx> --- 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@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel