mirror of
https://gitlab.freedesktop.org/wayland/wayland.git
synced 2025-11-02 09:01:39 -05:00
shm: Add shm_buffer ref and shm_pool unref functions
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. The ref/unref are asymmetrical (ref returns the pool) because it's possible the buffer itself will be gone when you need to unref the pool. Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk> Signed-off-by: Derek Foreman <derekf@osg.samsung.com>
This commit is contained in:
parent
06fb8bd371
commit
eba83cd5e1
2 changed files with 49 additions and 0 deletions
|
|
@ -362,6 +362,7 @@ wl_resource_get_destroy_listener(struct wl_resource *resource,
|
||||||
resource = tmp, \
|
resource = tmp, \
|
||||||
tmp = wl_resource_from_link(wl_resource_get_link(resource)->next))
|
tmp = wl_resource_from_link(wl_resource_get_link(resource)->next))
|
||||||
|
|
||||||
|
struct wl_shm_pool;
|
||||||
struct wl_shm_buffer;
|
struct wl_shm_buffer;
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -388,6 +389,12 @@ wl_shm_buffer_get_width(struct wl_shm_buffer *buffer);
|
||||||
int32_t
|
int32_t
|
||||||
wl_shm_buffer_get_height(struct wl_shm_buffer *buffer);
|
wl_shm_buffer_get_height(struct wl_shm_buffer *buffer);
|
||||||
|
|
||||||
|
struct wl_shm_pool *
|
||||||
|
wl_shm_buffer_ref_pool(struct wl_shm_buffer *buffer);
|
||||||
|
|
||||||
|
void
|
||||||
|
wl_shm_pool_unref(struct wl_shm_pool *pool);
|
||||||
|
|
||||||
int
|
int
|
||||||
wl_display_init_shm(struct wl_display *display);
|
wl_display_init_shm(struct wl_display *display);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -412,6 +412,48 @@ wl_shm_buffer_get_height(struct wl_shm_buffer *buffer)
|
||||||
return buffer->height;
|
return buffer->height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Get a reference to a shm_buffer's shm_pool
|
||||||
|
*
|
||||||
|
* \param buffer The buffer object
|
||||||
|
*
|
||||||
|
* Returns a pointer to a buffer's shm_pool and increases the
|
||||||
|
* shm_pool refcount.
|
||||||
|
*
|
||||||
|
* The compositor must remember to call wl_shm_pool_unref when
|
||||||
|
* it no longer needs the reference to ensure proper destruction
|
||||||
|
* of the pool.
|
||||||
|
*
|
||||||
|
* \memberof wl_shm_buffer
|
||||||
|
* \sa wl_shm_pool_unref
|
||||||
|
*/
|
||||||
|
WL_EXPORT struct wl_shm_pool *
|
||||||
|
wl_shm_buffer_ref_pool(struct wl_shm_buffer *buffer)
|
||||||
|
{
|
||||||
|
assert(buffer->pool->refcount);
|
||||||
|
|
||||||
|
buffer->pool->refcount++;
|
||||||
|
return buffer->pool;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Unreference a shm_pool
|
||||||
|
*
|
||||||
|
* \param buffer The pool object
|
||||||
|
*
|
||||||
|
* Drops a reference to a wl_shm_pool object.
|
||||||
|
*
|
||||||
|
* This is only necessary if the compositor has explicitly
|
||||||
|
* taken a reference with wl_shm_buffer_ref_pool(), otherwise
|
||||||
|
* the pool will be automatically destroyed when appropriate.
|
||||||
|
*
|
||||||
|
* \memberof wl_shm_pool
|
||||||
|
* \sa wl_shm_buffer_ref_pool
|
||||||
|
*/
|
||||||
|
WL_EXPORT void
|
||||||
|
wl_shm_pool_unref(struct wl_shm_pool *pool)
|
||||||
|
{
|
||||||
|
shm_pool_unref(pool);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
reraise_sigbus(void)
|
reraise_sigbus(void)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue