[PATCH] server: Add API to disable the event queue
Pekka Paalanen
ppaalanen at gmail.com
Mon Sep 16 02:08:03 PDT 2013
On Fri, 13 Sep 2013 16:12:27 +0100
Neil Roberts <neil at linux.intel.com> wrote:
> Adds wl_client_disable_queue and wl_client_enable_queue. When the
> queue is disabled, flushing the client will cause it to send all of
> the data regardless of whether ‘want_flush’ is set on the connection.
>
> The ‘want_flush’ mechanism is used to implement the event queue.
> Normally queued events are only sent once a later event is posted
> without the queue. It looks like this is currently only used in order
> to delay sending the buffer release events until a frame callback
> event is emitted at the same time to avoid waking up the clients more
> often than necessary.
>
> The problem with that is that if a client isn't using the frame
> callbacks and instead is throttling itself to the buffer release
> events then the queue will never get flushed and the client will wait
> forever. With this new API the compositor can recognise when a client
> doesn't have a frame callback installed and explicitly disable the
> queue so that it will get the buffer release events immediately.
Instead of all this, could you not have made Weston simply use
wl_resource_post_event() instead of wl_resource_queue_event()?
Btw. enable/disable_queue sounds like you would be freezing or thawing
a wl_queue or something like that.
Better wait for other comments, whether changing the release event
sending method is acceptable.
Thanks,
pq
> ---
> src/connection.c | 16 +++++++++++++++-
> src/wayland-private.h | 2 ++
> src/wayland-server.c | 12 ++++++++++++
> src/wayland-server.h | 2 ++
> 4 files changed, 31 insertions(+), 1 deletion(-)
>
> diff --git a/src/connection.c b/src/connection.c
> index 451b93e..5e26af1 100644
> --- a/src/connection.c
> +++ b/src/connection.c
> @@ -59,6 +59,7 @@ struct wl_connection {
> struct wl_buffer fds_in, fds_out;
> int fd;
> int want_flush;
> + int enable_queue;
> };
>
> static void
> @@ -157,6 +158,7 @@ wl_connection_create(int fd)
> return NULL;
> memset(connection, 0, sizeof *connection);
> connection->fd = fd;
> + connection->enable_queue = 1;
>
> return connection;
> }
> @@ -265,7 +267,7 @@ wl_connection_flush(struct wl_connection *connection)
> int len = 0, count, clen;
> uint32_t tail;
>
> - if (!connection->want_flush)
> + if (connection->enable_queue && !connection->want_flush)
> return 0;
>
> tail = connection->out.tail;
> @@ -372,6 +374,18 @@ wl_connection_queue(struct wl_connection *connection,
> return 0;
> }
>
> +void
> +wl_connection_enable_queue(struct wl_connection *connection)
> +{
> + connection->enable_queue = 1;
> +}
> +
> +void
> +wl_connection_disable_queue(struct wl_connection *connection)
> +{
> + connection->enable_queue = 0;
> +}
> +
> static int
> wl_message_count_arrays(const struct wl_message *message)
> {
> diff --git a/src/wayland-private.h b/src/wayland-private.h
> index 67e8783..6247cee 100644
> --- a/src/wayland-private.h
> +++ b/src/wayland-private.h
> @@ -92,6 +92,8 @@ void wl_connection_consume(struct wl_connection *connection, size_t size);
>
> int wl_connection_flush(struct wl_connection *connection);
> int wl_connection_read(struct wl_connection *connection);
> +void wl_connection_enable_queue(struct wl_connection *connection);
> +void wl_connection_disable_queue(struct wl_connection *connection);
>
> int wl_connection_write(struct wl_connection *connection, const void *data, size_t count);
> int wl_connection_queue(struct wl_connection *connection,
> diff --git a/src/wayland-server.c b/src/wayland-server.c
> index d7c58b9..6d37137 100644
> --- a/src/wayland-server.c
> +++ b/src/wayland-server.c
> @@ -591,6 +591,18 @@ wl_client_get_destroy_listener(struct wl_client *client,
> }
>
> WL_EXPORT void
> +wl_client_enable_queue(struct wl_client *client)
> +{
> + wl_connection_enable_queue(client->connection);
> +}
> +
> +WL_EXPORT void
> +wl_client_disable_queue(struct wl_client *client)
> +{
> + wl_connection_disable_queue(client->connection);
> +}
> +
> +WL_EXPORT void
> wl_client_destroy(struct wl_client *client)
> {
> uint32_t serial = 0;
> diff --git a/src/wayland-server.h b/src/wayland-server.h
> index 67f3bdd..95a1ae2 100644
> --- a/src/wayland-server.h
> +++ b/src/wayland-server.h
> @@ -123,6 +123,8 @@ void wl_client_add_destroy_listener(struct wl_client *client,
> struct wl_listener *listener);
> struct wl_listener *wl_client_get_destroy_listener(struct wl_client *client,
> wl_notify_func_t notify);
> +void wl_client_enable_queue(struct wl_client *client);
> +void wl_client_disable_queue(struct wl_client *client);
>
> struct wl_resource *
> wl_client_get_object(struct wl_client *client, uint32_t id);
More information about the wayland-devel
mailing list