On Tue, Feb 09, 2016 at 04:03:47PM -0600, Derek Foreman wrote: > This is a preliminary step towards deferring shm resize operations until > after the compositor has released all external references on a pool. > > Signed-off-by: Derek Foreman <der...@osg.samsung.com>
Yep looks good. Reviewed-by: Bryce Harrington <br...@osg.samsung.com> > --- > src/wayland-shm.c | 31 +++++++++++++++++++------------ > 1 file changed, 19 insertions(+), 12 deletions(-) > > diff --git a/src/wayland-shm.c b/src/wayland-shm.c > index a4343a4..6fbf34b 100644 > --- a/src/wayland-shm.c > +++ b/src/wayland-shm.c > @@ -52,7 +52,8 @@ static struct sigaction wl_shm_old_sigbus_action; > > struct wl_shm_pool { > struct wl_resource *resource; > - int refcount; > + int internal_refcount; > + int external_refcount; > char *data; > int32_t size; > }; > @@ -73,10 +74,14 @@ struct wl_shm_sigbus_data { > }; > > static void > -shm_pool_unref(struct wl_shm_pool *pool) > +shm_pool_unref(struct wl_shm_pool *pool, bool external) > { > - pool->refcount--; > - if (pool->refcount) > + if (external) > + pool->external_refcount--; > + else > + pool->internal_refcount--; > + > + if (pool->internal_refcount + pool->external_refcount) > return; > > munmap(pool->data, pool->size); > @@ -89,7 +94,7 @@ destroy_buffer(struct wl_resource *resource) > struct wl_shm_buffer *buffer = wl_resource_get_user_data(resource); > > if (buffer->pool) > - shm_pool_unref(buffer->pool); > + shm_pool_unref(buffer->pool, false); > free(buffer); > } > > @@ -162,13 +167,13 @@ shm_pool_create_buffer(struct wl_client *client, struct > wl_resource *resource, > buffer->stride = stride; > buffer->offset = offset; > buffer->pool = pool; > - pool->refcount++; > + pool->internal_refcount++; > > buffer->resource = > wl_resource_create(client, &wl_buffer_interface, 1, id); > if (buffer->resource == NULL) { > wl_client_post_no_memory(client); > - shm_pool_unref(pool); > + shm_pool_unref(pool, false); > free(buffer); > return; > } > @@ -183,7 +188,7 @@ destroy_pool(struct wl_resource *resource) > { > struct wl_shm_pool *pool = wl_resource_get_user_data(resource); > > - shm_pool_unref(pool); > + shm_pool_unref(pool, false); > } > > static void > @@ -243,7 +248,8 @@ shm_create_pool(struct wl_client *client, struct > wl_resource *resource, > goto err_free; > } > > - pool->refcount = 1; > + pool->internal_refcount = 1; > + pool->external_refcount = 0; > pool->size = size; > pool->data = mmap(NULL, size, > PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); > @@ -396,9 +402,10 @@ wl_shm_buffer_get_height(struct wl_shm_buffer *buffer) > WL_EXPORT struct wl_shm_pool * > wl_shm_buffer_ref_pool(struct wl_shm_buffer *buffer) > { > - assert(buffer->pool->refcount); > + assert(buffer->pool->internal_refcount + > + buffer->pool->external_refcount); > > - buffer->pool->refcount++; > + buffer->pool->external_refcount++; > return buffer->pool; > } > > @@ -418,7 +425,7 @@ wl_shm_buffer_ref_pool(struct wl_shm_buffer *buffer) > WL_EXPORT void > wl_shm_pool_unref(struct wl_shm_pool *pool) > { > - shm_pool_unref(pool); > + shm_pool_unref(pool, true); > } > > static void > -- > 2.7.0 > > _______________________________________________ > wayland-devel mailing list > wayland-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/wayland-devel _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/wayland-devel