[PATCH wayland 1/2] shm: Split pool reference counting into external and internal references
Bryce Harrington
bryce at osg.samsung.com
Sat Feb 20 03:09:57 UTC 2016
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 <derekf at osg.samsung.com>
Yep looks good.
Reviewed-by: Bryce Harrington <bryce at 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 at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/wayland-devel
More information about the wayland-devel
mailing list