On the client side we're going to need to know if an object from the map is a zombie before we attempt to dereference it, so we need to pass this to the iterator.
Signed-off-by: Derek Foreman <der...@osg.samsung.com> --- src/wayland-private.h | 3 ++- src/wayland-server.c | 21 +++++++++++++++------ src/wayland-util.c | 2 +- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/wayland-private.h b/src/wayland-private.h index d906a6f..58c01b6 100644 --- a/src/wayland-private.h +++ b/src/wayland-private.h @@ -80,7 +80,8 @@ struct wl_map { }; typedef enum wl_iterator_result (*wl_iterator_func_t)(void *element, - void *data); + void *data, + uint32_t flags); void wl_map_init(struct wl_map *map, uint32_t side); diff --git a/src/wayland-server.c b/src/wayland-server.c index b24fb65..422bd34 100644 --- a/src/wayland-server.c +++ b/src/wayland-server.c @@ -658,11 +658,9 @@ resource_is_deprecated(struct wl_resource *resource) } static enum wl_iterator_result -destroy_resource(void *element, void *data) +_destroy_resource(void *element, void *data, uint32_t flags) { struct wl_resource *resource = element; - struct wl_client *client = resource->client; - uint32_t flags; wl_signal_emit(&resource->deprecated_destroy_signal, resource); /* Don't emit the new signal for deprecated resources, as that would @@ -670,7 +668,6 @@ destroy_resource(void *element, void *data) if (!resource_is_deprecated(resource)) wl_priv_signal_emit(&resource->destroy_signal, resource); - flags = wl_map_lookup_flags(&client->objects, resource->object.id); if (resource->destroy) resource->destroy(resource); @@ -680,6 +677,18 @@ destroy_resource(void *element, void *data) return WL_ITERATOR_CONTINUE; } +static enum wl_iterator_result +destroy_resource(void *element, void *data) +{ + struct wl_resource *resource = element; + struct wl_client *client = resource->client; + uint32_t flags; + + flags = wl_map_lookup_flags(&client->objects, resource->object.id); + + return _destroy_resource(element, data, flags); +} + WL_EXPORT void wl_resource_destroy(struct wl_resource *resource) { @@ -829,7 +838,7 @@ wl_client_destroy(struct wl_client *client) wl_priv_signal_emit(&client->destroy_signal, client); wl_client_flush(client); - wl_map_for_each(&client->objects, destroy_resource, &serial); + wl_map_for_each(&client->objects, _destroy_resource, &serial); wl_map_release(&client->objects); wl_event_source_remove(client->source); close(wl_connection_destroy(client->connection)); @@ -1839,7 +1848,7 @@ struct wl_resource_iterator_context { }; static enum wl_iterator_result -resource_iterator_helper(void *res, void *user_data) +resource_iterator_helper(void *res, void *user_data, uint32_t flags) { struct wl_resource_iterator_context *context = user_data; struct wl_resource *resource = res; diff --git a/src/wayland-util.c b/src/wayland-util.c index cab7fc5..ce387f4 100644 --- a/src/wayland-util.c +++ b/src/wayland-util.c @@ -371,7 +371,7 @@ for_each_helper(struct wl_array *entries, wl_iterator_func_t func, void *data) for (p = start; p < end; p++) if (p->data && !map_entry_is_free(*p)) { - ret = func(map_entry_get_data(*p), data); + ret = func(map_entry_get_data(*p), data, map_entry_get_flags(*p)); if (ret != WL_ITERATOR_CONTINUE) break; } -- 2.11.0 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/wayland-devel