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>
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 @@ } 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 @@ 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 @@ 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->flags |= WL_PROXY_FLAG_DESTROYED; - proxy->refcount--; - if (!proxy->refcount) - free(proxy); + wl_proxy_unref(proxy); } /** Destroy a proxy object @@ -1305,11 +1306,7 @@ 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;