[PATCH wayland 3/3] server: Add a simple API to find a good default display
Jason Ekstrand
jason at jlekstrand.net
Wed May 7 18:31:56 PDT 2014
On Wed, May 7, 2014 at 9:25 AM, Jasper St. Pierre <jstpierre at mecheye.net>wrote:
> This allows compositors to easily select a good display to listen on.
> ---
> src/wayland-server.c | 23 +++++++++++++++++++++++
> src/wayland-server.h | 2 ++
> 2 files changed, 25 insertions(+)
>
> diff --git a/src/wayland-server.c b/src/wayland-server.c
> index 6bc8dc3..5624199 100644
> --- a/src/wayland-server.c
> +++ b/src/wayland-server.c
> @@ -1078,6 +1078,29 @@ open_socket_for_display_name(struct wl_socket *s,
> const char *name)
> return 0;
> }
>
> +WL_EXPORT char *
> +wl_choose_default_display(void)
>
I mentioned this on IRC, but this seems like an awkward name. Perhaps
something like wl_display_choose_default_name? See also below.
> +{
> + struct wl_socket s = { 0 };
> + int displayno = 0;
> + char display_name[16] = "";
> +
> + /* A reasonable number of maximum default sockets. If
> + * you need more than this, set WAYLAND_DISPLAY explicitly. */
> + const int MAX_DISPLAYNO = 32;
> +
> + do {
> + snprintf(display_name, sizeof display_name, "wayland-%d",
> displayno);
> + if (open_socket_for_display_name(&s, display_name) >= 0) {
> + close(s->fd_lock);
> + return strdup(display_name);
>
We have a race condition here. If two compositors start up at the same
time, it's possible that wl_choose_default_display will return "wayland-1"
but then, before we get a chance to actually re-lock and connect to it,
some other compositor opens it. Honestly, this probably isn't going to be
a huge problem in practice. However, we may want to re-think the API a bit.
One option would be to do the enumeration in wl_display_add_socket if the
given name is NULL. This is a small API break, but all it changes is "if
name==NULL and WAYLAND_DISPLAY is not set and wayland-0 is taken, fail" to
"if name==NULL and WAYLAND_DISPLAY is not set and wayland-0 is taken, try
wayland-1 etc.". It slightly changes default behavior, but I don't really
see why failing on wayland-0 being taken is a good thing.
Thanks,
--Jason Ekstrand
> + }
> + } while (displayno++ < MAX_DISPLAYNO);
> +
> + errno = EINVAL;
> + return NULL;
> +}
> +
> WL_EXPORT int
> wl_display_add_socket(struct wl_display *display, const char *name)
> {
> diff --git a/src/wayland-server.h b/src/wayland-server.h
> index 7fc5b47..c9834f1 100644
> --- a/src/wayland-server.h
> +++ b/src/wayland-server.h
> @@ -88,6 +88,8 @@ struct wl_listener *wl_event_loop_get_destroy_listener(
> struct wl_event_loop *loop,
> wl_notify_func_t notify);
>
> +char *wl_choose_default_socket(void);
> +
> struct wl_display *wl_display_create(void);
> void wl_display_destroy(struct wl_display *display);
> struct wl_event_loop *wl_display_get_event_loop(struct wl_display
> *display);
> --
> 1.9.0
>
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/wayland-devel/attachments/20140507/182d24d1/attachment.html>
More information about the wayland-devel
mailing list