On Tue, Jan 12, 2016 at 08:22:56AM +0900, Jaeyoon Jung wrote:
> When processing a closure, data in the connection can be consumed again
> if the closure itself invokes extra event dispatch. In that case the
> remaining data size is also altered, so the variable len should be
> updated after the closure is processed.
> 
> Signed-off-by: Jaeyoon Jung <[email protected]>

I don't like the name wl_connection_size (wl_connection_pending_input()
or something would be more descriptive).

Besides that, the patch looks correct to me, so Reviewed-by: Jonas Ådahl
<[email protected]>

A good follow up would be a test case where this would otherwise cause
issues. I assume it would be triggered by a wl_event_loop_dispatch() in
a interface request handler?


Jonas

> ---
>  src/connection.c      | 8 +++++++-
>  src/wayland-private.h | 3 +++
>  src/wayland-server.c  | 3 ++-
>  3 files changed, 12 insertions(+), 2 deletions(-)
> 
> diff --git a/src/connection.c b/src/connection.c
> index 6742f19..2a7e29b 100644
> --- a/src/connection.c
> +++ b/src/connection.c
> @@ -314,6 +314,12 @@ wl_connection_flush(struct wl_connection *connection)
>       return connection->out.head - tail;
>  }
>  
> +uint32_t
> +wl_connection_size(struct wl_connection *connection)
> +{
> +     return wl_buffer_size(&connection->in);
> +}
> +
>  int
>  wl_connection_read(struct wl_connection *connection)
>  {
> @@ -350,7 +356,7 @@ wl_connection_read(struct wl_connection *connection)
>  
>       connection->in.head += len;
>  
> -     return connection->in.head - connection->in.tail;
> +     return wl_connection_size(connection);
>  }
>  
>  int
> diff --git a/src/wayland-private.h b/src/wayland-private.h
> index 58ac952..98b46ab 100644
> --- a/src/wayland-private.h
> +++ b/src/wayland-private.h
> @@ -121,6 +121,9 @@ wl_connection_consume(struct wl_connection *connection, 
> size_t size);
>  int
>  wl_connection_flush(struct wl_connection *connection);
>  
> +uint32_t
> +wl_connection_size(struct wl_connection *connection);
> +
>  int
>  wl_connection_read(struct wl_connection *connection);
>  
> diff --git a/src/wayland-server.c b/src/wayland-server.c
> index 55c0cf9..1488c56 100644
> --- a/src/wayland-server.c
> +++ b/src/wayland-server.c
> @@ -313,7 +313,6 @@ wl_client_connection_data(int fd, uint32_t mask, void 
> *data)
>  
>               closure = wl_connection_demarshal(client->connection, size,
>                                                 &client->objects, message);
> -             len -= size;
>  
>               if (closure == NULL && errno == ENOMEM) {
>                       wl_resource_post_no_memory(resource);
> @@ -346,6 +345,8 @@ wl_client_connection_data(int fd, uint32_t mask, void 
> *data)
>  
>               if (client->error)
>                       break;
> +
> +             len = wl_connection_size(connection);
>       }
>  
>       if (client->error)
> -- 
> 2.6.4
> 
> _______________________________________________
> wayland-devel mailing list
> [email protected]
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to