[PATCH wayland] client: Fix double locking bug

Kristian Høgsberg hoegsberg at gmail.com
Thu Oct 11 06:52:56 PDT 2012


On Thu, Oct 11, 2012 at 02:20:28PM +0300, Ander Conselvan de Oliveira wrote:
> 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.

Ah, yes, very nice.  One less entry point and one less double-locking bug.

Kristian

> [1] commit 9de9e39f87adfce1ea9755e394928756254c0ba2
>     Author: Kristian Høgsberg <krh at bitplanet.net>
>     Date:   Thu Jun 28 22:01:58 2012 -0400
> 
>         Allocate client proxy automatically for new objects
> ---
>  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 c007f4c..f06407d 100644
> --- a/src/wayland-client.c
> +++ b/src/wayland-client.c
> @@ -117,7 +117,8 @@ wl_display_create_queue(struct wl_display *display)
>  	return queue;
>  }
>  
> -WL_EXPORT struct wl_proxy *
> +/* The caller should hold the display lock */
> +static struct wl_proxy *
>  wl_proxy_create(struct wl_proxy *factory, const struct wl_interface *interface)
>  {
>  	struct wl_proxy *proxy;
> @@ -133,10 +134,8 @@ wl_proxy_create(struct wl_proxy *factory, const struct wl_interface *interface)
>  	proxy->queue = factory->queue;
>  	proxy->id_deleted = 0;
>  
> -	pthread_mutex_lock(&display->mutex);
>  	proxy->object.id = wl_map_insert_new(&display->objects,
>  					     WL_MAP_CLIENT_SIDE, proxy);
> -	pthread_mutex_unlock(&display->mutex);
>  
>  	return proxy;
>  }
> diff --git a/src/wayland-client.h b/src/wayland-client.h
> index f064010..cb1be9c 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,
> -- 
> 1.7.9.5
> 
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel


More information about the wayland-devel mailing list