[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