From 1e16bf2af23bbdaa2c9664289f7ed3ce1b80e5e3 Mon Sep 17 00:00:00 2001 From: Derek Foreman Date: Mon, 4 Apr 2016 16:57:30 -0500 Subject: wayland_shm: Fix resize optimization We're supposed to allocate a large pool at startup and use it for resizing to save pool allocations. However, this was broken and we ended up allocating both a large pool and a proper sized pool every resize. This restores correct behaviour. --- src/modules/evas/engines/wayland_shm/evas_shm.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/modules/evas/engines/wayland_shm/evas_shm.c b/src/modules/evas/engines/wayland_shm/evas_shm.c index f54e7d11a1..22924e053f 100644 --- a/src/modules/evas/engines/wayland_shm/evas_shm.c +++ b/src/modules/evas/engines/wayland_shm/evas_shm.c @@ -5,6 +5,7 @@ static Eina_Bool _shm_leaf_create(Shm_Surface *surface, Shm_Leaf *leaf, int w, int h); static void _shm_leaf_release(Shm_Leaf *leaf); +static void _shm_leaf_destroy(Shm_Leaf *leaf); static struct wl_shm_pool * _shm_pool_make(struct wl_shm *shm, int size, void **data) @@ -301,11 +302,25 @@ static void _shm_leaf_release(Shm_Leaf *leaf) { LOGFN(__FILE__, __LINE__, __FUNCTION__); + Shm_Pool *resize_pool; + /* if we delete resize_pool here we blow away the clever optimization + * it provides (and end up doing two allocations per resize when we + * might have done none at all). + */ + resize_pool = leaf->resize_pool; if (leaf->data) _shm_data_destroy(leaf->data); - if (leaf->resize_pool) _shm_pool_destroy(leaf->resize_pool); memset(leaf, 0, sizeof(*leaf)); leaf->valid = EINA_FALSE; + leaf->resize_pool = resize_pool; +} + +static void +_shm_leaf_destroy(Shm_Leaf *leaf) +{ + _shm_leaf_release(leaf); + if (leaf->resize_pool) _shm_pool_destroy(leaf->resize_pool); + leaf->resize_pool = NULL; } Shm_Surface * @@ -355,7 +370,7 @@ _evas_shm_surface_destroy(Shm_Surface *surface) LOGFN(__FILE__, __LINE__, __FUNCTION__); for (; i < surface->num_buff; i++) - _shm_leaf_release(&surface->leaf[i]); + _shm_leaf_destroy(&surface->leaf[i]); free(surface); } -- cgit v1.2.1