[PATCH] server: Calculate remainig data size after a closure is processed
Derek Foreman
derekf at osg.samsung.com
Mon Jan 11 09:07:29 PST 2016
On 11/01/16 03:32 AM, Jaeyoon Jung wrote:
> While 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 as a result. So we should update len
> variable with the correct value after the closure is processed.
>
> Signed-off-by: Jaeyoon Jung <jaeyoon.jung at lge.com>
> ---
> 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..3c8f727 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 connection->in.head - connection->in.tail;
How about return wl_buffer_size(&connection->in);
That done, Reviewed-by: Derek Foreman <derekf at osg.samsung.com>
This is actually very similar to a patch I have locally. :)
Thanks,
Derek
> +}
> +
> 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)
>
More information about the wayland-devel
mailing list