[PATCH wayland 5/5] Add API to retrieve and iterate over the resources list of a client

Pekka Paalanen ppaalanen at gmail.com
Fri Jun 17 12:07:42 UTC 2016


On Mon,  7 Mar 2016 18:31:35 +0100
Giulio Camuffo <giuliocamuffo at gmail.com> wrote:

> To complement on the new resource created signal, this allows to
> iterate over the existing resources of a client.
> ---
>  src/wayland-server-core.h |  8 ++++++++
>  src/wayland-server.c      | 23 +++++++++++++++++++++++
>  2 files changed, 31 insertions(+)
> 
> diff --git a/src/wayland-server-core.h b/src/wayland-server-core.h
> index 9af2481..9980c29 100644
> --- a/src/wayland-server-core.h
> +++ b/src/wayland-server-core.h
> @@ -221,6 +221,14 @@ void
>  wl_client_add_resource_created_listener(struct wl_client *client,
>                                          struct wl_listener *listener);
>  
> +typedef void (*wl_client_for_each_resource_iterator_func_t)(struct wl_resource *,
> +                                                            void *user_data);
> +
> +void
> +wl_client_for_each_resource(struct wl_client *client,
> +                            wl_client_for_each_resource_iterator_func_t iterator,
> +                            void *user_data);

Hi,

I wrote some pondering for patch 3 about the style of the API. Not much
choice here because of the wl_map.

Would you ever want to stop iterating in the middle? Should we return a
bool or int from the func_t to signal early return?

> +
>  /** \class wl_listener
>   *
>   * \brief A single listener for Wayland signals
> diff --git a/src/wayland-server.c b/src/wayland-server.c
> index 56e17c3..e47ccec 100644
> --- a/src/wayland-server.c
> +++ b/src/wayland-server.c
> @@ -1584,6 +1584,29 @@ wl_client_add_resource_created_listener(struct wl_client *client,
>  	wl_signal_add(&client->resource_created_signal, listener);
>  }
>  
> +/** Iterate over all the resources of a client
> + *
> + * \param client The client object
> + * \param iterator The iterator function
> + * \param user_data The user data pointer
> + *
> + * The function pointed by \a iterator will be called for each
> + * resource owned by the client. The \a user_data will be passed
> + * as the second argument of the iterator function.
> + *
> + * \memberof wl_client

Is it safe to create or destroy wl_resources while iterating, or is it
forbidden?

Please, document that.

> + */
> +WL_EXPORT void
> +wl_client_for_each_resource(struct wl_client *client,
> +			    wl_client_for_each_resource_iterator_func_t iterator,
> +			    void *user_data)
> +{
> +	/* wl_iterator_func_t passes wl_object as the first argument, and
> +	 * wl_resource is a wl_object, so we can safely cast it. */
> +	wl_iterator_func_t it = (wl_iterator_func_t)iterator;

This function-pointer-casting is a little odd, since it will never be
cast back to the correct one before calling it. I'm sure it works as
is, but... this could really use a test in 'make check', if not wrapped
in a correct type.

> +	wl_map_for_each(&client->objects, it, user_data);
> +}
> +
>  /** \cond */ /* Deprecated functions below. */
>  
>  uint32_t

Looks good otherwise.


Thanks,
pq
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 811 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/wayland-devel/attachments/20160617/6cc3fb14/attachment.sig>


More information about the wayland-devel mailing list