On Wed, May 7, 2014 at 9:25 AM, Jasper St. Pierre <jstpie...@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@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/wayland-devel >
_______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel