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

Jason Ekstrand jason at jlekstrand.net
Thu Jun 6 05:54:12 PDT 2013


On Jun 6, 2013 1:37 AM, "Pekka Paalanen" <ppaalanen at gmail.com> wrote:
>
> 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?

Even better, server side should never use zombie objects at all.  However,
it is used in connection.c, so I had to put it in wayland-util.  This is
one of those places where the "shared code" between client and server isn't
quite as generic/universal as one would like.

Thanks for reviewing,

--Jason Ekstrand
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/wayland-devel/attachments/20130606/0d26ff7d/attachment-0001.html>


More information about the wayland-devel mailing list