[PATCH 3/4] xwayland: Keep a list of wayland globals

Dima Ryazanov dima at gmail.com
Thu May 14 01:38:28 PDT 2015


On Thu, May 14, 2015 at 12:57 AM, Marek Chalupa <mchqwerty at gmail.com> wrote:

> On Tue, May 12, 2015 at 7:21 PM, Dima Ryazanov <dima at gmail.com> wrote:
>
>> The logic is pretty much copied from weston's clients/window.c.
>>
>> Signed-off-by: Dima Ryazanov <dima at gmail.com>
>> ---
>>  hw/xwayland/xwayland.c | 25 ++++++++++++++++++++++++-
>>  hw/xwayland/xwayland.h |  8 ++++++++
>>  2 files changed, 32 insertions(+), 1 deletion(-)
>>
>> diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c
>> index 7e8d667..e99fbac 100644
>> --- a/hw/xwayland/xwayland.c
>> +++ b/hw/xwayland/xwayland.c
>> @@ -383,6 +383,17 @@ registry_global(void *data, struct wl_registry
>> *registry, uint32_t id,
>>                  const char *interface, uint32_t version)
>>  {
>>      struct xwl_screen *xwl_screen = data;
>> +    struct xwl_global *xwl_global;
>> +
>> +    xwl_global = calloc(sizeof *xwl_global, 1);
>> +    if (xwl_global == NULL) {
>> +        ErrorF("registry_global ENOMEM\n");
>> +        return;
>> +    }
>> +    xwl_global->name = id;
>> +    xwl_global->interface = strdup(interface);
>>
>
> You should probably check if the strdup succeeds here. In the following
> patch you do
>   if (strcmp(xwl_global->interface, "wl_output") == 0)
> and if the strdup returns NULL, then this contition will be false even
> thoug it should be true.
>

Oh, good catch.


>
>
>> +    xwl_global->version = version;
>> +    xorg_list_add(&xwl_global->link, &xwl_screen->global_list);
>>
>>      if (strcmp(interface, "wl_compositor") == 0) {
>>          xwl_screen->compositor =
>> @@ -410,7 +421,18 @@ registry_global(void *data, struct wl_registry
>> *registry, uint32_t id,
>>  static void
>>  global_remove(void *data, struct wl_registry *registry, uint32_t name)
>>  {
>> -    /* Nothing to do here, wl_compositor and wl_shm should not be
>> removed */
>> +    struct xwl_screen *xwl_screen = data;
>> +    struct xwl_global *xwl_global, *next_xwl_global;
>> +
>> +    xorg_list_for_each_entry_safe(xwl_global, next_xwl_global,
>> +                                  &xwl_screen->global_list, link) {
>> +        if (xwl_global->name != name)
>> +            continue;
>> +
>> +        xorg_list_del(&xwl_global->link);
>> +        free(xwl_global->interface);
>> +        free(xwl_global);
>>
>
> Here a break would be handy, so that we won't iterate over the rest of
> globals after we found the one we need.
>

Sure.


> +    }
>>  }
>>
>>  static const struct wl_registry_listener registry_listener = {
>> @@ -562,6 +584,7 @@ xwl_screen_init(ScreenPtr pScreen, int argc, char
>> **argv)
>>              listen_on_fds(xwl_screen);
>>      }
>>
>> +    xorg_list_init(&xwl_screen->global_list);
>>      xorg_list_init(&xwl_screen->output_list);
>>      xorg_list_init(&xwl_screen->seat_list);
>>      xorg_list_init(&xwl_screen->damage_window_list);
>> diff --git a/hw/xwayland/xwayland.h b/hw/xwayland/xwayland.h
>> index cfb343d..2ba5312 100644
>> --- a/hw/xwayland/xwayland.h
>> +++ b/hw/xwayland/xwayland.h
>> @@ -64,6 +64,7 @@ struct xwl_screen {
>>      UnrealizeWindowProcPtr UnrealizeWindow;
>>      XYToWindowProcPtr XYToWindow;
>>
>> +    struct xorg_list global_list;
>>      struct xorg_list output_list;
>>      struct xorg_list seat_list;
>>      struct xorg_list damage_window_list;
>> @@ -95,6 +96,13 @@ struct xwl_screen {
>>      struct glamor_context *glamor_ctx;
>>  };
>>
>> +struct xwl_global {
>> +    uint32_t name;
>> +    char *interface;
>> +    uint32_t version;
>> +    struct xorg_list link;
>> +};
>> +
>>  struct xwl_window {
>>      struct xwl_screen *xwl_screen;
>>      struct wl_surface *surface;
>> --
>> 2.4.0
>>
>> _______________________________________________
>> wayland-devel mailing list
>> wayland-devel at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
>>
>
> Isn't storing all globals redundant for this purpose? Couldn't we add the
> name (id) into struct xwl_output and then
> iterate just over the output_list?
>

Correct - if we only care about xwl_output, then the globals list is
unnecessary. I only did it that way because that's how weston does it, and
it feels more generic - it makes it easy to handle different types of
globals in the future. That said, it offers no performance advantages since
it's just iterating over the whole list. A hash table would make more sense.

Anyways, I'll remove it for now.


>
> Thanks,
> Marek
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.x.org/archives/xorg-devel/attachments/20150514/137449b5/attachment.html>


More information about the xorg-devel mailing list