[PATCH] client: clarify wl_display_prepare_read() semantics

Pekka Paalanen ppaalanen at gmail.com
Thu Aug 28 08:52:53 PDT 2014


On Thu, 28 Aug 2014 15:59:37 +0200
Marek Chalupa <mchqwerty at gmail.com> wrote:

> On 28 August 2014 12:02, Pekka Paalanen <ppaalanen at gmail.com> wrote:
> 
> > On Mon,  4 Aug 2014 11:30:46 +0200
> > Marek Chalupa <mchqwerty at gmail.com> wrote:
> >
> > > From the doc comment I get the feeling, that after successfull call to
> > > wl_display_prepare_read(), the thread gains exclusive access to the fd.
> > > That is not true. It only ensures that _one_ of the threads, that called
> > > this function, will read from the fd and there will be no race.
> > >
> > > Here's slice of the commit message that introduces
> > > wl_display_prepare_read() (3c7e8bfbb4745315b7bcbf69fa746c3d6718c305):
> > >
> > >   "wl_display_prepare_read() registers the calling thread as a potential
> > >    reader of events.  Once data is available on the fd, all reader
> > >    threads must call wl_display_read_events(), at which point
> > >    one of the threads will read from the fd and distribute the events
> > >    to event queues.  When that is done, all threads return from
> > >    wl_display_read_events()."
> > >
> > > That is not clear from the doc message.
> > > ---
> > >  src/wayland-client.c | 27 +++++++++++++++++++++++----
> > >  1 file changed, 23 insertions(+), 4 deletions(-)
> > >
> > > diff --git a/src/wayland-client.c b/src/wayland-client.c
> > > index 19b5694..d7de24d 100644
> > > --- a/src/wayland-client.c
> > > +++ b/src/wayland-client.c
> > > @@ -1155,6 +1155,12 @@ read_events(struct wl_display *display)
> > >               pthread_cond_broadcast(&display->reader_cond);
> > >       } else {
> > >               serial = display->read_serial;
> > > +             /* in the case that the thread is not allowed to read
> > > +              * from the fd, make it sleep until reading and dispatching
> > > +              * is done. The condition display->read_serial == serial)
> > is
> > > +              * because it may happen, that some thread will call this
> > > +              * function after the reading is done and without this, the
> > > +              * thread would block until next pthread_cond_broadcast */
> > >               while (display->read_serial == serial)
> > >                       pthread_cond_wait(&display->reader_cond,
> > >                                         &display->mutex);
> >
> > I think the condition here is to ensure, that the function call will
> > not return until someone has actually read the fd, not to avoid
> > blocking in some cases. Apparently there could be spurious wake-ups,
> > and need to protect against them. The 'serial' is set to
> > display->read_serial just before waiting, and the mutex is held, so the
> > cond_wait is guaranteed to happen at least once.
> >
> > This branch cannot be entered "after" the reading was done, because
> > it is always the last call here that reads, when reader_count hits zero.
> >
> >
> Yes, you're right. That's the real purpose of it. My mistake. However,
> AFAIK in the current code this loop
> will run only once, because everywhere is the cond broadcast called along
> with
> increasing the serial.

The manual I could find:
http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_cond_wait.html
says that spurious wakeups may occur. So better keep the serial
there.


> Regarding the allowed actions.. do you have something particular in mind?
> Theoretically,
> programmer can safely use everything that doesn't change
> display->readers_count.
> (basically everything except wl_display_dispatch_queue).
> But I don't know why he would do that - the expected action is just to call
> wl_display_read_events
> (with possibly poll before that) once you're prepared to read.

Nothing particular in my mind, I was just wondering if there was
any old API that might break this. OTOH, that can be written off as
just not using the new API correctly.

> > Or better yet, add a chapter to the publican docs about integrating
> > libwayland-client to an event loop. I don't recall there being that
> > yet...
> >
> >
> > Thanks,
> > pq
> >
> 
> Thanks for notes,
> I'll fix the patch and eventually try to write up some 'big doc' for that.

Very good. I think this is one of the areas that are easy to get
subtly wrong, so a good doc is valuable. :-)


Thanks,
pq


More information about the wayland-devel mailing list