[PATCH wayland] shm: Add wl_shm_buffer get/put functions
Derek Foreman
derekf at osg.samsung.com
Fri Jul 17 14:30:26 PDT 2015
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.
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