[RFC PATCH wayland v2 1/4] move flag from proxy to wl_object

Marek Chalupa mchqwerty at gmail.com
Fri Apr 10 06:45:38 PDT 2015


wl_proxy can have flags like destroyed or deleted_id that are used
to handle races. It turned out that having similar flags with wl_resources
would be handy too. wl_proxy and wl_resource share the same base
which is wl_object. Add flags to wl_object and remove them from
wl_proxy, so that we can use the same flags in both, server and client
objects.

Signed-off-by: Marek Chalupa <mchqwerty at gmail.com>
---
 src/wayland-client.c  | 18 ++++++------------
 src/wayland-private.h |  6 ++++++
 2 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/src/wayland-client.c b/src/wayland-client.c
index ed108e1..ff2b61a 100644
--- a/src/wayland-client.c
+++ b/src/wayland-client.c
@@ -46,16 +46,10 @@
 
 /** \cond */
 
-enum wl_proxy_flag {
-	WL_PROXY_FLAG_ID_DELETED = (1 << 0),
-	WL_PROXY_FLAG_DESTROYED = (1 << 1)
-};
-
 struct wl_proxy {
 	struct wl_object object;
 	struct wl_display *display;
 	struct wl_event_queue *queue;
-	uint32_t flags;
 	int refcount;
 	void *user_data;
 	wl_dispatcher_func_t dispatcher;
@@ -234,7 +228,7 @@ decrease_closure_args_refcount(struct wl_closure *closure)
 		case 'o':
 			proxy = (struct wl_proxy *) closure->args[i].o;
 			if (proxy) {
-				if (proxy->flags & WL_PROXY_FLAG_DESTROYED)
+				if (proxy->object.flags & WL_OBJECT_FLAG_DESTROYED)
 					closure->args[i].o = NULL;
 
 				proxy->refcount--;
@@ -402,7 +396,7 @@ wl_proxy_create_for_id(struct wl_proxy *factory,
 void
 proxy_destroy(struct wl_proxy *proxy)
 {
-	if (proxy->flags & WL_PROXY_FLAG_ID_DELETED)
+	if (proxy->object.flags & WL_OBJECT_FLAG_ID_DELETED)
 		wl_map_remove(&proxy->display->objects, proxy->object.id);
 	else if (proxy->object.id < WL_SERVER_ID_START)
 		wl_map_insert_at(&proxy->display->objects, 0,
@@ -412,7 +406,7 @@ proxy_destroy(struct wl_proxy *proxy)
 				 proxy->object.id, NULL);
 
 
-	proxy->flags |= WL_PROXY_FLAG_DESTROYED;
+	proxy->object.flags |= WL_OBJECT_FLAG_DESTROYED;
 
 	proxy->refcount--;
 	if (!proxy->refcount)
@@ -728,7 +722,7 @@ display_handle_delete_id(void *data, struct wl_display *display, uint32_t id)
 		wl_log("error: received delete_id for unknown id (%u)\n", id);
 
 	if (proxy && proxy != WL_ZOMBIE_OBJECT)
-		proxy->flags |= WL_PROXY_FLAG_ID_DELETED;
+		proxy->object.flags |= WL_OBJECT_FLAG_ID_DELETED;
 	else
 		wl_map_remove(&display->objects, id);
 
@@ -835,11 +829,11 @@ wl_display_connect_to_fd(int fd)
 	display->proxy.object.interface = &wl_display_interface;
 	display->proxy.object.id =
 		wl_map_insert_new(&display->objects, 0, display);
+	display->proxy.object.flags = 0;
 	display->proxy.display = display;
 	display->proxy.object.implementation = (void(**)(void)) &display_listener;
 	display->proxy.user_data = display;
 	display->proxy.queue = &display->default_queue;
-	display->proxy.flags = 0;
 	display->proxy.refcount = 1;
 
 	display->connection = wl_connection_create(display->fd);
@@ -1142,7 +1136,7 @@ dispatch_event(struct wl_display *display, struct wl_event_queue *queue)
 
 	decrease_closure_args_refcount(closure);
 	proxy = closure->proxy;
-	proxy_destroyed = !!(proxy->flags & WL_PROXY_FLAG_DESTROYED);
+	proxy_destroyed = !!(proxy->object.flags & WL_OBJECT_FLAG_DESTROYED);
 
 	proxy->refcount--;
 	if (proxy_destroyed) {
diff --git a/src/wayland-private.h b/src/wayland-private.h
index db76081..ab48889 100644
--- a/src/wayland-private.h
+++ b/src/wayland-private.h
@@ -42,10 +42,16 @@
 #define WL_SERVER_ID_START 0xff000000
 #define WL_CLOSURE_MAX_ARGS 20
 
+enum wl_object_flags {
+	WL_OBJECT_FLAG_DESTROYED  = 1 << 0,
+	WL_OBJECT_FLAG_ID_DELETED = 1 << 1
+};
+
 struct wl_object {
 	const struct wl_interface *interface;
 	const void *implementation;
 	uint32_t id;
+	uint32_t flags;
 };
 
 extern struct wl_object global_zombie_object;
-- 
2.1.0



More information about the wayland-devel mailing list