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
