[PATCH wayland v2 4/8] client: Use read preparation API in wl_display_dispatch_queue()
Bill Spitzak
spitzak at gmail.com
Wed Dec 30 22:39:02 PST 2015
I was going to propose the same thing, though I was uncertain if it
really was equivalent. IMHO this looks correct as it is almost identical
to my patch (mine lacked the changes for EPIPE and had a nested if so
there was only one call to dispatch_queue).
It would also help to fix the documentation to say that this function is
identical to this other sequence.
On 12/28/2015 06:10 PM, Jonas Ådahl wrote:
> Instead of doing things that do the equivalent of using
> wl_display_prepare_read() and friends, just use the public API. The
> only semantical difference is that we will now unlock and lock the mutex
> more times compared to before.
>
> Signed-off-by: Jonas Ådahl <jadahl at gmail.com>
> ---
> src/wayland-client.c | 45 ++++++++++-----------------------------------
> 1 file changed, 10 insertions(+), 35 deletions(-)
>
> diff --git a/src/wayland-client.c b/src/wayland-client.c
> index 035825c..8bf6124 100644
> --- a/src/wayland-client.c
> +++ b/src/wayland-client.c
> @@ -1488,30 +1488,17 @@ wl_display_dispatch_queue(struct wl_display *display,
> struct pollfd pfd[2];
> int ret;
>
> - pthread_mutex_lock(&display->mutex);
> -
> - ret = dispatch_queue(display, queue);
> - if (ret == -1)
> - goto err_unlock;
> - if (ret > 0) {
> - pthread_mutex_unlock(&display->mutex);
> - return ret;
> - }
> + if (wl_display_prepare_read_queue(display, queue) == -1)
> + return wl_display_dispatch_queue_pending(display, queue);
>
> - /* We ignore EPIPE here, so that we try to read events before
> - * returning an error. When the compositor sends an error it
> - * will close the socket, and if we bail out here we don't get
> - * a chance to process the error. */
> - ret = wl_connection_flush(display->connection);
> + /* Don't stop if flushing hits an EPIPE; continue so we can read any
> + * protocol error that may have triggered it. */
> + ret = wl_display_flush(display);
> if (ret < 0 && errno != EAGAIN && errno != EPIPE) {
> - display_fatal_error(display, errno);
> - goto err_unlock;
> + wl_display_cancel_read(display);
> + return -1;
> }
>
> - display->reader_count++;
> -
> - pthread_mutex_unlock(&display->mutex);
> -
> pfd[0].fd = display->fd;
> pfd[0].events = POLLIN;
> do {
> @@ -1523,22 +1510,10 @@ wl_display_dispatch_queue(struct wl_display *display,
> return -1;
> }
>
> - pthread_mutex_lock(&display->mutex);
> -
> - if (read_events(display) == -1)
> - goto err_unlock;
> -
> - ret = dispatch_queue(display, queue);
> - if (ret == -1)
> - goto err_unlock;
> -
> - pthread_mutex_unlock(&display->mutex);
> -
> - return ret;
> + if (wl_display_read_events(display) == -1)
> + return -1;
>
> - err_unlock:
> - pthread_mutex_unlock(&display->mutex);
> - return -1;
> + return wl_display_dispatch_queue_pending(display, queue);
> }
>
> /** Dispatch pending events in an event queue
>
More information about the wayland-devel
mailing list