[PATCH wayland] shm: Add wl_shm_buffer get/put functions

Giulio Camuffo giuliocamuffo at gmail.com
Sun Oct 4 08:34:05 PDT 2015


2015-07-18 0:30 GMT+03:00 Derek Foreman <derekf at osg.samsung.com>:
> Sometimes the compositor wants to make sure a shm pool doesn't disappear
> out from under it.
>
> For example, in Enlightenment, rendering happens in a separate thread
> while the main thread can still dispatch events.  If a client is destroyed
> during rendering, all its resources are cleaned up and its shm pools are
> unmapped.  This causes the rendering thread to segfault.
>
> This patch adds a way for the compositor to increment the refcount of the
> shm pool so it can't disappear, and decrement it when it's finished.

I don't like much the names of these new functions, i wouldn't expect
a function named get_something() to have side effects. Also,
wl_shm_buffer_put_pool() doesn't take a wl_shm_buffer, but the
wl_shm_pool.
What about wl_shm_buffer_ref_pool(buffer) and
wl_shm_pool_deref(pool)/wl_shm_buffer_deref_pool(buffer)?


--
Giulio

>
> Signed-off-by: Derek Foreman <derekf at osg.samsung.com>
> ---
>  src/wayland-server-core.h |  7 +++++++
>  src/wayland-shm.c         | 15 +++++++++++++++
>  2 files changed, 22 insertions(+)
>
> diff --git a/src/wayland-server-core.h b/src/wayland-server-core.h
> index e605432..a4a04fc 100644
> --- a/src/wayland-server-core.h
> +++ b/src/wayland-server-core.h
> @@ -362,6 +362,7 @@ wl_resource_get_destroy_listener(struct wl_resource *resource,
>              resource = tmp,                                                    \
>              tmp = wl_resource_from_link(wl_resource_get_link(resource)->next))
>
> +struct wl_shm_pool;
>  struct wl_shm_buffer;
>
>  void
> @@ -388,6 +389,12 @@ wl_shm_buffer_get_width(struct wl_shm_buffer *buffer);
>  int32_t
>  wl_shm_buffer_get_height(struct wl_shm_buffer *buffer);
>
> +struct wl_shm_pool *
> +wl_shm_buffer_get_pool(struct wl_shm_buffer *buffer);
> +
> +void
> +wl_shm_buffer_put_pool(struct wl_shm_pool *pool);
> +
>  int
>  wl_display_init_shm(struct wl_display *display);
>
> diff --git a/src/wayland-shm.c b/src/wayland-shm.c
> index 5c419fa..48b5140 100644
> --- a/src/wayland-shm.c
> +++ b/src/wayland-shm.c
> @@ -412,6 +412,21 @@ wl_shm_buffer_get_height(struct wl_shm_buffer *buffer)
>         return buffer->height;
>  }
>
> +WL_EXPORT struct wl_shm_pool *
> +wl_shm_buffer_get_pool(struct wl_shm_buffer *buffer)
> +{
> +       assert(buffer->pool->refcount);
> +
> +       buffer->pool->refcount++;
> +       return buffer->pool;
> +}
> +
> +WL_EXPORT void
> +wl_shm_buffer_put_pool(struct wl_shm_pool *pool)
> +{
> +       shm_pool_unref(pool);
> +}
> +
>  static void
>  reraise_sigbus(void)
>  {
> --
> 2.1.4
>


More information about the wayland-devel mailing list