[PATCH wayland 2/4] Add support for flags in the wl_map API and add a WL_MAP_ENTRY_LEGACY flag

Jason Ekstrand jason at jlekstrand.net
Mon Jun 3 07:56:42 PDT 2013


On Mon, Jun 3, 2013 at 4:36 AM, Ander Conselvan de Oliveira <
conselvan2 at gmail.com> wrote:

> On 06/02/2013 01:40 AM, Jason Ekstrand wrote:
>
>> The implementation in this commit allows for one bit worth of flags.  If
>> more flags are desired at a future date, then the wl_map implementation
>> will have to change but the wl_map API will not.
>>
>
> I couldn't find a description of what WL_MAP_ENTRY_LEGACY is supposed to
> mean anywhere in the patch. Would be good to document that in the commit
> message and/or near the enum definition. And maybe this explanation would
> also make clear why flags are necessary.
>

The purpose is so that we can deprecate the internals of wl_resource.  We
need a way (that doesn't involve changing wl_resource) to flag a resource
as being a legacy version 1.0 resource so we can special-case it.  We can
do this by building it into wl_map.  Perhaps there should be a comment in
there to that effect.

--Jason Ekstrand


>
> Cheers,
> Ander
>
>
>
>  Signed-off-by: Jason Ekstrand <jason at jlekstrand.net>
>> ---
>>   src/wayland-client.c  | 12 ++++++------
>>   src/wayland-private.h | 13 +++++++++++--
>>   src/wayland-server.c  | 12 ++++++------
>>   src/wayland-util.c    | 41 ++++++++++++++++++++++++++++++**+++++------
>>   4 files changed, 58 insertions(+), 20 deletions(-)
>>
>> diff --git a/src/wayland-client.c b/src/wayland-client.c
>> index 0f5e093..bea73e0 100644
>> --- a/src/wayland-client.c
>> +++ b/src/wayland-client.c
>> @@ -226,7 +226,7 @@ wl_proxy_create(struct wl_proxy *factory, const
>> struct wl_interface *interface)
>>         proxy->refcount = 1;
>>
>>         pthread_mutex_lock(&display->**mutex);
>> -       proxy->object.id = wl_map_insert_new(&display->**objects, proxy);
>> +       proxy->object.id = wl_map_insert_new(&display->**objects, 0,
>> proxy);
>>         pthread_mutex_unlock(&display-**>mutex);
>>
>>         return proxy;
>> @@ -252,7 +252,7 @@ wl_proxy_create_for_id(struct wl_proxy *factory,
>>         proxy->flags = 0;
>>         proxy->refcount = 1;
>>
>> -       wl_map_insert_at(&display->**objects, id, proxy);
>> +       wl_map_insert_at(&display->**objects, 0, id, proxy);
>>
>>         return proxy;
>>   }
>> @@ -273,10 +273,10 @@ wl_proxy_destroy(struct wl_proxy *proxy)
>>         if (proxy->flags & WL_PROXY_FLAG_ID_DELETED)
>>                 wl_map_remove(&proxy->display-**>objects, proxy->
>> object.id);
>>         else if (proxy->object.id < WL_SERVER_ID_START)
>> -               wl_map_insert_at(&proxy->**display->objects,
>> +               wl_map_insert_at(&proxy->**display->objects, 0,
>>                                  proxy->object.id, WL_ZOMBIE_OBJECT);
>>         else
>> -               wl_map_insert_at(&proxy->**display->objects,
>> +               wl_map_insert_at(&proxy->**display->objects, 0,
>>                                  proxy->object.id, NULL);
>>
>>
>> @@ -522,11 +522,11 @@ wl_display_connect_to_fd(int fd)
>>         wl_list_init(&display->event_**queue_list);
>>         pthread_mutex_init(&display->**mutex, NULL);
>>
>> -       wl_map_insert_new(&display->**objects, NULL);
>> +       wl_map_insert_new(&display->**objects, 0, NULL);
>>
>>         display->proxy.object.**interface = &wl_display_interface;
>>         display->proxy.object.id =
>> -               wl_map_insert_new(&display->**objects, display);
>> +               wl_map_insert_new(&display->**objects, 0, display);
>>         display->proxy.display = display;
>>         display->proxy.object.**implementation = (void(**)(void))
>> &display_listener;
>>         display->proxy.user_data = display;
>> diff --git a/src/wayland-private.h b/src/wayland-private.h
>> index 270b470..a648538 100644
>> --- a/src/wayland-private.h
>> +++ b/src/wayland-private.h
>> @@ -41,6 +41,14 @@
>>   #define WL_SERVER_ID_START 0xff000000
>>   #define WL_CLOSURE_MAX_ARGS 20
>>
>> +/* 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
>> + * to change to allow for new flags */
>> +enum wl_map_entry_flags {
>> +       WL_MAP_ENTRY_LEGACY = (1 << 0)
>> +};
>> +
>>   struct wl_map {
>>         struct wl_array client_entries;
>>         struct wl_array server_entries;
>> @@ -52,11 +60,12 @@ typedef void (*wl_iterator_func_t)(void *element,
>> void *data);
>>
>>   void wl_map_init(struct wl_map *map, uint32_t side);
>>   void wl_map_release(struct wl_map *map);
>> -uint32_t wl_map_insert_new(struct wl_map *map, void *data);
>> -int wl_map_insert_at(struct wl_map *map, uint32_t i, void *data);
>> +uint32_t wl_map_insert_new(struct wl_map *map, uint32_t flags, void
>> *data);
>> +int wl_map_insert_at(struct wl_map *map, uint32_t flags, uint32_t i,
>> void *data);
>>   int wl_map_reserve_new(struct wl_map *map, uint32_t i);
>>   void wl_map_remove(struct wl_map *map, uint32_t i);
>>   void *wl_map_lookup(struct wl_map *map, uint32_t i);
>> +uint32_t wl_map_lookup_flags(struct wl_map *map, uint32_t i);
>>   void wl_map_for_each(struct wl_map *map, wl_iterator_func_t func, void
>> *data);
>>
>>   struct wl_connection;
>> diff --git a/src/wayland-server.c b/src/wayland-server.c
>> index c96be56..2d13d9d 100644
>> --- a/src/wayland-server.c
>> +++ b/src/wayland-server.c
>> @@ -338,7 +338,7 @@ wl_client_create(struct wl_display *display, int fd)
>>
>>         wl_map_init(&client->objects, WL_MAP_SERVER_SIDE);
>>
>> -       if (wl_map_insert_at(&client->**objects, 0, NULL) < 0)
>> +       if (wl_map_insert_at(&client->**objects, 0, 0, NULL) < 0)
>>                 goto err_map;
>>
>>         wl_signal_init(&client->**destroy_signal);
>> @@ -379,8 +379,8 @@ wl_client_add_resource(struct wl_client *client,
>>   {
>>         if (resource->object.id == 0) {
>>                 resource->object.id =
>> -                       wl_map_insert_new(&client->**objects, resource);
>> -       } else if (wl_map_insert_at(&client->**objects,
>> +                       wl_map_insert_new(&client->**objects, 0,
>> resource);
>> +       } else if (wl_map_insert_at(&client->**objects, 0,
>>                                   resource->object.id, resource) < 0) {
>>                 wl_resource_post_error(client-**>display_resource,
>>                                        WL_DISPLAY_ERROR_INVALID_**OBJECT,
>> @@ -433,7 +433,7 @@ wl_resource_destroy(struct wl_resource *resource)
>>                         wl_resource_queue_event(**
>> client->display_resource,
>>                                                 WL_DISPLAY_DELETE_ID, id);
>>                 }
>> -               wl_map_insert_at(&client->**objects, id, NULL);
>> +               wl_map_insert_at(&client->**objects, 0, id, NULL);
>>         } else {
>>                 wl_map_remove(&client->**objects, id);
>>         }
>> @@ -912,7 +912,7 @@ wl_client_add_object(struct wl_client *client,
>>         resource->client = client;
>>         resource->destroy = (void *) free;
>>
>> -       if (wl_map_insert_at(&client->**objects, resource->object.id,
>> resource) < 0) {
>> +       if (wl_map_insert_at(&client->**objects, 0, resource->object.id,
>> resource) < 0) {
>>                 wl_resource_post_error(client-**>display_resource,
>>                                        WL_DISPLAY_ERROR_INVALID_**OBJECT,
>>                                        "invalid new id %d",
>> @@ -931,7 +931,7 @@ wl_client_new_object(struct wl_client *client,
>>   {
>>         uint32_t id;
>>
>> -       id = wl_map_insert_new(&client->**objects, NULL);
>> +       id = wl_map_insert_new(&client->**objects, 0, NULL);
>>         return wl_client_add_object(client,
>>                                     interface, implementation, id, data);
>>
>> diff --git a/src/wayland-util.c b/src/wayland-util.c
>> index 57f496b..162b352 100644
>> --- a/src/wayland-util.c
>> +++ b/src/wayland-util.c
>> @@ -151,6 +151,10 @@ union map_entry {
>>         void *data;
>>   };
>>
>> +#define map_entry_is_free(entry) ((entry).next & 0x1)
>> +#define map_entry_get_data(entry) ((void *)((entry).next &
>> ~(uintptr_t)0x3))
>> +#define map_entry_get_flags(entry) (((entry).next >> 1) & 0x1)
>> +
>>   WL_EXPORT void
>>   wl_map_init(struct wl_map *map, uint32_t side)
>>   {
>> @@ -166,7 +170,7 @@ wl_map_release(struct wl_map *map)
>>   }
>>
>>   WL_EXPORT uint32_t
>> -wl_map_insert_new(struct wl_map *map, void *data)
>> +wl_map_insert_new(struct wl_map *map, uint32_t flags, void *data)
>>   {
>>         union map_entry *start, *entry;
>>         struct wl_array *entries;
>> @@ -192,12 +196,13 @@ wl_map_insert_new(struct wl_map *map, void *data)
>>         }
>>
>>         entry->data = data;
>> +       entry->next |= (flags & 0x1) << 1;
>>
>>         return (entry - start) + base;
>>   }
>>
>>   WL_EXPORT int
>> -wl_map_insert_at(struct wl_map *map, uint32_t i, void *data)
>> +wl_map_insert_at(struct wl_map *map, uint32_t flags, uint32_t i, void
>> *data)
>>   {
>>         union map_entry *start;
>>         uint32_t count;
>> @@ -225,6 +230,7 @@ wl_map_insert_at(struct wl_map *map, uint32_t i, void
>> *data)
>>
>>         start = entries->data;
>>         start[i].data = data;
>> +       start[i].next |= (flags & 0x1) << 1;
>>
>>         return 0;
>>   }
>> @@ -309,12 +315,35 @@ wl_map_lookup(struct wl_map *map, uint32_t i)
>>         start = entries->data;
>>         count = entries->size / sizeof *start;
>>
>> -       if (i < count && !(start[i].next & 1))
>> -               return start[i].data;
>> +       if (i < count && !map_entry_is_free(start[i]))
>> +               return map_entry_get_data(start[i]);
>>
>>         return NULL;
>>   }
>>
>> +WL_EXPORT uint32_t
>> +wl_map_lookup_flags(struct wl_map *map, uint32_t i)
>> +{
>> +       union map_entry *start;
>> +       uint32_t count;
>> +       struct wl_array *entries;
>> +
>> +       if (i < WL_SERVER_ID_START) {
>> +               entries = &map->client_entries;
>> +       } else {
>> +               entries = &map->server_entries;
>> +               i -= WL_SERVER_ID_START;
>> +       }
>> +
>> +       start = entries->data;
>> +       count = entries->size / sizeof *start;
>> +
>> +       if (i < count && !map_entry_is_free(start[i]))
>> +               return map_entry_get_flags(start[i]);
>> +
>> +       return 0;
>> +}
>> +
>>   static void
>>   for_each_helper(struct wl_array *entries, wl_iterator_func_t func, void
>> *data)
>>   {
>> @@ -324,8 +353,8 @@ for_each_helper(struct wl_array *entries,
>> wl_iterator_func_t func, void *data)
>>         end = (union map_entry *) ((char *) entries->data +
>> entries->size);
>>
>>         for (p = start; p < end; p++)
>> -               if (p->data && !(p->next & 1))
>> -                       func(p->data, data);
>> +               if (p->data && !map_entry_is_free(*p))
>> +                       func(map_entry_get_data(*p), data);
>>   }
>>
>>   WL_EXPORT void
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/wayland-devel/attachments/20130603/c6431daf/attachment.html>


More information about the wayland-devel mailing list