diff options
-rw-r--r-- | src/connection.c | 27 | ||||
-rw-r--r-- | src/wayland-client.c | 5 | ||||
-rw-r--r-- | src/wayland-private.h | 6 | ||||
-rw-r--r-- | src/wayland-server.c | 16 |
4 files changed, 39 insertions, 15 deletions
diff --git a/src/connection.c b/src/connection.c index 4ac5bf8..6bcc91a 100644 --- a/src/connection.c +++ b/src/connection.c @@ -269,7 +269,8 @@ wl_connection_data(struct wl_connection *connection, uint32_t mask) msg.msg_flags = 0; do { - len = sendmsg(connection->fd, &msg, MSG_NOSIGNAL); + len = sendmsg(connection->fd, &msg, + MSG_NOSIGNAL | MSG_DONTWAIT); } while (len < 0 && errno == EINTR); if (len == -1 && errno == EPIPE) { @@ -326,13 +327,14 @@ wl_connection_data(struct wl_connection *connection, uint32_t mask) return connection->in.head - connection->in.tail; } -void +int wl_connection_write(struct wl_connection *connection, const void *data, size_t count) { if (connection->out.head - connection->out.tail + count > ARRAY_LENGTH(connection->out.data)) - wl_connection_data(connection, WL_CONNECTION_WRITABLE); + if (wl_connection_data(connection, WL_CONNECTION_WRITABLE)) + return -1; wl_buffer_put(&connection->out, data, count); @@ -343,17 +345,22 @@ wl_connection_write(struct wl_connection *connection, connection->data); connection->write_signalled = 1; } + + return 0; } -static void +static int wl_connection_queue(struct wl_connection *connection, const void *data, size_t count) { if (connection->out.head - connection->out.tail + count > ARRAY_LENGTH(connection->out.data)) - wl_connection_data(connection, WL_CONNECTION_WRITABLE); + if (wl_connection_data(connection, WL_CONNECTION_WRITABLE)) + return -1; wl_buffer_put(&connection->out, data, count); + + return 0; } static int @@ -734,22 +741,24 @@ wl_closure_invoke(struct wl_closure *closure, ffi_call(&closure->cif, func, &result, closure->args); } -void +int wl_closure_send(struct wl_closure *closure, struct wl_connection *connection) { uint32_t size; size = closure->start[1] >> 16; - wl_connection_write(connection, closure->start, size); + + return wl_connection_write(connection, closure->start, size); } -void +int wl_closure_queue(struct wl_closure *closure, struct wl_connection *connection) { uint32_t size; size = closure->start[1] >> 16; - wl_connection_queue(connection, closure->start, size); + + return wl_connection_queue(connection, closure->start, size); } void diff --git a/src/wayland-client.c b/src/wayland-client.c index 9656cb5..498a429 100644 --- a/src/wayland-client.c +++ b/src/wayland-client.c @@ -203,7 +203,10 @@ wl_proxy_marshal(struct wl_proxy *proxy, uint32_t opcode, ...) abort(); } - wl_closure_send(closure, proxy->display->connection); + if (wl_closure_send(closure, proxy->display->connection)) { + fprintf(stderr, "Error sending request: %m\n"); + abort(); + } if (wl_debug) wl_closure_print(closure, &proxy->object, true); diff --git a/src/wayland-private.h b/src/wayland-private.h index dee5ed1..bdeafd4 100644 --- a/src/wayland-private.h +++ b/src/wayland-private.h @@ -65,7 +65,7 @@ void wl_connection_destroy(struct wl_connection *connection); void wl_connection_copy(struct wl_connection *connection, void *data, size_t size); void wl_connection_consume(struct wl_connection *connection, size_t size); int wl_connection_data(struct wl_connection *connection, uint32_t mask); -void wl_connection_write(struct wl_connection *connection, const void *data, size_t count); +int wl_connection_write(struct wl_connection *connection, const void *data, size_t count); struct wl_closure * wl_connection_vmarshal(struct wl_connection *connection, @@ -81,9 +81,9 @@ wl_connection_demarshal(struct wl_connection *connection, void wl_closure_invoke(struct wl_closure *closure, struct wl_object *target, void (*func)(void), void *data); -void +int wl_closure_send(struct wl_closure *closure, struct wl_connection *connection); -void +int wl_closure_queue(struct wl_closure *closure, struct wl_connection *connection); void wl_closure_print(struct wl_closure *closure, struct wl_object *target, int send); diff --git a/src/wayland-server.c b/src/wayland-server.c index bf81334..c70e411 100644 --- a/src/wayland-server.c +++ b/src/wayland-server.c @@ -88,6 +88,14 @@ struct wl_global { static int wl_debug = 0; +static void +destroy_client(void *data) +{ + struct wl_client *client = data; + + wl_client_destroy(client); +} + WL_EXPORT void wl_resource_post_event(struct wl_resource *resource, uint32_t opcode, ...) { @@ -104,7 +112,9 @@ wl_resource_post_event(struct wl_resource *resource, uint32_t opcode, ...) if (closure == NULL) return; - wl_closure_send(closure, resource->client->connection); + if (wl_closure_send(closure, resource->client->connection)) + wl_event_loop_add_idle(resource->client->display->loop, + destroy_client, resource->client); if (wl_debug) wl_closure_print(closure, object, true); @@ -129,7 +139,9 @@ wl_resource_queue_event(struct wl_resource *resource, uint32_t opcode, ...) if (closure == NULL) return; - wl_closure_queue(closure, resource->client->connection); + if (wl_closure_queue(closure, resource->client->connection)) + wl_event_loop_add_idle(resource->client->display->loop, + destroy_client, resource->client); if (wl_debug) wl_closure_print(closure, object, true); |