diff options
author | Daniel Stone <daniels@collabora.com> | 2017-12-28 15:50:06 +0000 |
---|---|---|
committer | Daniel Stone <daniels@collabora.com> | 2018-01-09 15:18:04 +0000 |
commit | 430c7820c31608dd29408fc800530b4fd08ff777 (patch) | |
tree | d637ae0d8b1839ab166c8321ccf465e8cba1c9dd | |
parent | b39d8933973394432bf994b0c6e564fdaceb4757 (diff) |
client: Add wl_proxy_unref helper
Rather than open-coded decrement-and-maybe-free, introduce a
wl_proxy_unref helper to do this for us. This will come in useful for
future patches, where we may also have to free a zombie object.
Signed-off-by: Daniel Stone <daniels@collabora.com>
Reviewed-by: Derek Foreman <derekf@osg.samsung.com>
Cc: Jonas Ã…dahl <jadahl@gmail.com>
-rw-r--r-- | src/wayland-client.c | 37 |
1 files changed, 17 insertions, 20 deletions
diff --git a/src/wayland-client.c b/src/wayland-client.c index 55838cd..f3d71b0 100644 --- a/src/wayland-client.c +++ b/src/wayland-client.c @@ -223,6 +223,19 @@ wl_event_queue_init(struct wl_event_queue *queue, struct wl_display *display) } static void +wl_proxy_unref(struct wl_proxy *proxy) +{ + assert(proxy->refcount > 0); + if (--proxy->refcount > 0) + return; + + /* If we get here, the client must have explicitly requested + * deletion. */ + assert(proxy->flags & WL_PROXY_FLAG_DESTROYED); + free(proxy); +} + +static void decrease_closure_args_refcount(struct wl_closure *closure) { const char *signature; @@ -241,10 +254,7 @@ decrease_closure_args_refcount(struct wl_closure *closure) if (proxy) { if (proxy->flags & WL_PROXY_FLAG_DESTROYED) closure->args[i].o = NULL; - - proxy->refcount--; - if (!proxy->refcount) - free(proxy); + wl_proxy_unref(proxy); } break; default: @@ -257,20 +267,13 @@ static void wl_event_queue_release(struct wl_event_queue *queue) { struct wl_closure *closure; - struct wl_proxy *proxy; while (!wl_list_empty(&queue->event_list)) { closure = container_of(queue->event_list.next, struct wl_closure, link); wl_list_remove(&closure->link); - decrease_closure_args_refcount(closure); - - proxy = closure->proxy; - proxy->refcount--; - if (!proxy->refcount) - free(proxy); - + wl_proxy_unref(closure->proxy); wl_closure_destroy(closure); } } @@ -416,9 +419,7 @@ proxy_destroy(struct wl_proxy *proxy) proxy->flags |= WL_PROXY_FLAG_DESTROYED; - proxy->refcount--; - if (!proxy->refcount) - free(proxy); + wl_proxy_unref(proxy); } /** Destroy a proxy object @@ -1305,11 +1306,7 @@ dispatch_event(struct wl_display *display, struct wl_event_queue *queue) decrease_closure_args_refcount(closure); proxy = closure->proxy; proxy_destroyed = !!(proxy->flags & WL_PROXY_FLAG_DESTROYED); - - proxy->refcount--; - if (!proxy->refcount) - free(proxy); - + wl_proxy_unref(proxy); if (proxy_destroyed) { wl_closure_destroy(closure); return; |