swc

Unnamed repository; edit this file 'description' to name the repository.
git clone git://git.nihaljere.xyz/swc
Log | Files | Refs | README | LICENSE

commit ddda681cac0be7802482f836737ed3cfce9d9088
parent 330bc84f1db920d11b51368649c7d08c7ee8d226
Author: Michael Forney <mforney@mforney.org>
Date:   Mon, 24 Feb 2014 01:11:58 -0800

shm: Fix pool destruction

Diffstat:
Mlibswc/shm.c | 15++++++++++-----
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)