[PATCH 4/4] client: fix bug with display->reader_count < 0
Pekka Paalanen
ppaalanen at gmail.com
Thu Sep 4 06:20:56 PDT 2014
On Fri, 29 Aug 2014 11:21:31 +0200
Marek Chalupa <mchqwerty at gmail.com> wrote:
> If we will try call wl_display_read_events() again,
> after we got EAGAIN from previous call, we get deadlock
> as shown in test. The bug works like this: after first call
> to wl_display_read_events() the display->reader_count is 0
> and next call will decrease it to -1 so the thread will make
> sleeping itself and we have a deadlock.
>
> We have two options here:
>
> Either we can wake up all threads before returning from
> read_events() and thus force the programmer to do the whole
> prepare+read loop again. Waking up all the threads could bring
> unnecessary overhead.
>
> The other solution, that I chose, is to return without waking up
> the threads, so that programmer can try read again
> - it feels natural after getting EAGAIN. Thus the proper use
> of wl_display_read_events should look like:
>
> do {
> ret = wl_display_read_events(display);
> } while (ret == 0 && errno == EAGAIN);
According to my understanding, this is just not the way how to use
wl_display_read_events(), so NAK for patches 3 and 4. Explanation is in
my reply to patch 3.
Patches 1 and 2 look nice, so those are pushed.
Thanks,
pq
>
> The solution is simple. Before returning from read_events under
> these circumstances, increase the display->reader_count back to 1,
> so that next trial will have the same execution path as the one
> before.
>
> Signed-off-by: Marek Chalupa <mchqwerty at gmail.com>
> ---
> src/wayland-client.c | 13 +++++++++++--
> 1 file changed, 11 insertions(+), 2 deletions(-)
More information about the wayland-devel
mailing list