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 <[email protected]> > --- > 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 <[email protected]> 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) > _______________________________________________ wayland-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/wayland-devel
