summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaeyoon Jung <jaeyoon.jung@lge.com>2016-01-12 13:12:34 +0900
committerDerek Foreman <derekf@osg.samsung.com>2016-01-12 10:45:33 -0600
commit0a37511ecc0117339e5e5d0add84a2f3b51493d2 (patch)
treee20532c9ab0067097876811d88c2009cc15feb1a
parentee9b69cfe0c94a297e1dea7cc4ff147d740c4294 (diff)
downloadwayland-0a37511ecc0117339e5e5d0add84a2f3b51493d2.tar.gz
server: Calculate remaining data size after a closure is processed
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 <jaeyoon.jung@lge.com> Reviewed-by: Jonas Ã…dahl <jadahl@gmail.com> Reviewed-by: Derek Foreman <derekf@osg.samsung.com>
-rw-r--r--src/connection.c8
-rw-r--r--src/wayland-private.h3
-rw-r--r--src/wayland-server.c3
3 files changed, 12 insertions, 2 deletions
diff --git a/src/connection.c b/src/connection.c
index 45a2e78..bc373f6 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_pending_input(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_pending_input(connection);
}
int
diff --git a/src/wayland-private.h b/src/wayland-private.h
index 0e3420c..da578d1 100644
--- a/src/wayland-private.h
+++ b/src/wayland-private.h
@@ -122,6 +122,9 @@ wl_connection_consume(struct wl_connection *connection, size_t size);
int
wl_connection_flush(struct wl_connection *connection);
+uint32_t
+wl_connection_pending_input(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 9e26b18..2158c08 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_pending_input(connection);
}
if (client->error)