[PATCH wayland 1/2] Change WL_ZOMBIE_OBJECT from 0x2 to an actual pointer

Pekka Paalanen ppaalanen at gmail.com
Wed Jun 5 23:36:58 PDT 2013


On Wed,  5 Jun 2013 16:39:50 -0500
Jason Ekstrand <jason at jlekstrand.net> wrote:

> In order to use the second-lowest bit of each pointer in wl_map for the
> WL_MAP_ENTRY_LEGACY flag, every pointer has to be a multiple of 4.  This
> was a good assumption, except with WL_ZOMBIE_OBJECT.  This commit creates
> an actual static variable to which WL_ZOMBIE_OBJECT now points.  Since
> things are only every compared to WL_ZOMBIE_OBJECT with "==" or "!=", the
> only thing that matters is that it is unique.
> 
> Signed-off-by: Jason Ekstrand <jason at jlekstrand.net>
> ---
>  src/wayland-private.h | 5 +++--
>  src/wayland-util.c    | 2 ++
>  2 files changed, 5 insertions(+), 2 deletions(-)
> 
> diff --git a/src/wayland-private.h b/src/wayland-private.h
> index a648538..6f7a347 100644
> --- a/src/wayland-private.h
> +++ b/src/wayland-private.h
> @@ -34,13 +34,14 @@
>  	const __typeof__( ((type *)0)->member ) *__mptr = (ptr);	\
>  	(type *)( (char *)__mptr - offsetof(type,member) );})
>  
> -#define WL_ZOMBIE_OBJECT ((void *) 2)
> -
>  #define WL_MAP_SERVER_SIDE 0
>  #define WL_MAP_CLIENT_SIDE 1
>  #define WL_SERVER_ID_START 0xff000000
>  #define WL_CLOSURE_MAX_ARGS 20
>  
> +extern struct wl_object global_zombie_object;
> +#define WL_ZOMBIE_OBJECT ((void*)&global_zombie_object)
> +
>  /* Flags for wl_map_insert_new and wl_map_insert_at.  Flags can be queried with
>   * wl_map_lookup_flags.  The current implementation has room for 1 bit worth of
>   * flags.  If more flags are ever added, the implementation of wl_map will have
> diff --git a/src/wayland-util.c b/src/wayland-util.c
> index 162b352..7a0b268 100644
> --- a/src/wayland-util.c
> +++ b/src/wayland-util.c
> @@ -29,6 +29,8 @@
>  #include "wayland-util.h"
>  #include "wayland-private.h"
>  
> +struct wl_object global_zombie_object;
> +
>  WL_EXPORT void
>  wl_list_init(struct wl_list *list)
>  {

So, global_zombie_object gets compiled into wayland-util.o, which makes
it private/hidden in both libwayland-server.so and
libwayland-client.so. Is there any danger of these getting mixed up,
when a program links to both?

The identity of the zombie depends on which library's util functions
actually get called, right? Looking at wayland-util.h, there are no
public entry points that would both be shared and access a wl_map. Only
functions unique to either libwayland-server or libwayland-client will
access a wl_map, so I assume they would be linked to the wayland-util.o
symbols in that specific library. Default visibility = hidden should
guarantee that.

Am I right that there is no danger here?


Thanks,
pq


More information about the wayland-devel mailing list