commit ddda681cac0be7802482f836737ed3cfce9d9088
parent 330bc84f1db920d11b51368649c7d08c7ee8d226
Author: Michael Forney <mforney@mforney.org>
Date: Mon, 24 Feb 2014 01:11:58 -0800
shm: Fix pool destruction
Diffstat:
1 file changed, 10 insertions(+), 5 deletions(-)
diff --git a/libswc/shm.c b/libswc/shm.c
@@ -58,10 +58,8 @@ struct pool_reference
struct pool * pool;
};
-static void unref_pool(struct wl_resource * resource)
+static void unref_pool(struct pool * pool)
{
- struct pool * pool = wl_resource_get_user_data(resource);
-
if (--pool->references > 0)
return;
@@ -69,12 +67,19 @@ static void unref_pool(struct wl_resource * resource)
free(pool);
}
+static void destroy_pool_resource(struct wl_resource * resource)
+{
+ struct pool * pool = wl_resource_get_user_data(resource);
+
+ unref_pool(pool);
+}
+
static void handle_buffer_destroy(struct wld_destructor * destructor)
{
struct pool_reference * reference
= CONTAINER_OF(destructor, typeof(*reference), destructor);
- unref_pool(reference->pool->resource);
+ unref_pool(reference->pool);
}
static inline uint32_t format_shm_to_wld(uint32_t format)
@@ -191,7 +196,7 @@ static void create_pool(struct wl_client * client,
}
wl_resource_set_implementation(pool->resource, &shm_pool_implementation,
- pool, &unref_pool);
+ pool, &destroy_pool_resource);
pool->data = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0);
if (pool->data == MAP_FAILED)