From ff4afd6c0c0a1dd5a49d7078c52a6a037089341a Mon Sep 17 00:00:00 2001 From: Ander Conselvan de Oliveira Date: Thu, 11 Oct 2012 14:55:59 +0300 Subject: [PATCH] client: Fix double locking bug MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The function wl_proxy_create_for_id() would try to acquire the display lock, but the only call path leading to it would call it with the lock already acquired. This patch removes the attempt to acquire the lock and makes the function static. It was exported before because client had to create proxy's manually when the server sent a new object id, but since commit 9de9e39f [1] this is no longer necessary. [1] commit 9de9e39f87adfce1ea9755e394928756254c0ba2 Author: Kristian Høgsberg Date: Thu Jun 28 22:01:58 2012 -0400 Allocate client proxy automatically for new objects v2: Change the right function. Previous patch changed wl_proxy_create() instead of wl_proxy_create_for_id(). --- src/wayland-client.c | 5 ++--- src/wayland-client.h | 3 --- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/wayland-client.c b/src/wayland-client.c index c007f4c1..625cd760 100644 --- a/src/wayland-client.c +++ b/src/wayland-client.c @@ -141,7 +141,8 @@ wl_proxy_create(struct wl_proxy *factory, const struct wl_interface *interface) return proxy; } -WL_EXPORT struct wl_proxy * +/* The caller should hold the display lock */ +static struct wl_proxy * wl_proxy_create_for_id(struct wl_proxy *factory, uint32_t id, const struct wl_interface *interface) { @@ -159,9 +160,7 @@ wl_proxy_create_for_id(struct wl_proxy *factory, proxy->queue = factory->queue; proxy->id_deleted = 0; - pthread_mutex_lock(&display->mutex); wl_map_insert_at(&display->objects, id, proxy); - pthread_mutex_unlock(&display->mutex); return proxy; } diff --git a/src/wayland-client.h b/src/wayland-client.h index f0640102..cb1be9c7 100644 --- a/src/wayland-client.h +++ b/src/wayland-client.h @@ -39,9 +39,6 @@ void wl_event_queue_destroy(struct wl_event_queue *queue); void wl_proxy_marshal(struct wl_proxy *p, uint32_t opcode, ...); struct wl_proxy *wl_proxy_create(struct wl_proxy *factory, const struct wl_interface *interface); -struct wl_proxy *wl_proxy_create_for_id(struct wl_proxy *factory, - uint32_t id, - const struct wl_interface *interface); void wl_proxy_destroy(struct wl_proxy *proxy); int wl_proxy_add_listener(struct wl_proxy *proxy,