Improve wl_signal_emit() func call when children destroyed 84/317084/1
authorTaeHyeon Jeong <thyeon.jeong@samsung.com>
Tue, 13 Aug 2024 04:57:29 +0000 (13:57 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Wed, 4 Sep 2024 00:53:49 +0000 (09:53 +0900)
- AS-IS
if we try to add listener to info (child) using add_destroy_listener() func, listener is added to client (parent) rather than info.

for this reason, when info is destroyed, client's destroy signal is emitted, so all added listeners recive signal.

- TO-BE
client don't have info's destroy signal and info have its own destroy signal. so, when info is destroyed, info emits its own destroy signal.

Change-Id: Ida00bfc4d0bcb51c6df462281413ecf8d8024be0

src/display_policy/display_policy.c
src/global_resource/global_resource.c
src/memory_flusher/memory_flusher.c
src/renderer/renderer.c
src/screen_rotation/screen_rotation.c

index e2788882b6aadc73450f8511914ec34182b0d5b2..558e741d7206ce2b7984033f4a8dd2895081fdf1 100644 (file)
@@ -33,10 +33,6 @@ struct ds_tizen_display_policy_client
 
     struct wl_list infos;
 
-   struct {
-        struct wl_signal destroy;
-    } events;
-
     struct wl_list link; // ds_tizen_display_policy::clients
 };
 
@@ -48,6 +44,10 @@ struct ds_tizen_display_policy_info
 
     int32_t brightness_value;
 
+    struct {
+        struct wl_signal destroy;
+    } events;
+
     struct wl_list link; // ds_tizen_display_policy_client::infos
 };
 
@@ -117,7 +117,7 @@ ds_tizen_display_policy_info_add_destroy_listener(
         struct ds_tizen_display_policy_info *info,
         struct wl_listener *listener)
 {
-    wl_signal_add(&info->client->events.destroy, listener);
+    wl_signal_add(&info->events.destroy, listener);
 }
 
 WL_EXPORT struct ds_surface *
@@ -177,6 +177,8 @@ tizen_display_policy_client_get_info(struct ds_tizen_display_policy_client *clie
     info->client = client;
     info->surface = surface;
 
+    wl_signal_init(&info->events.destroy);
+
     wl_list_insert(&client->infos, &info->link);
 
     return info;
@@ -256,7 +258,7 @@ _tizen_display_policy_client_handle_destroy(struct wl_resource *resource)
     ds_inf("_tizen_display_policy_client_handle_destroy (client:%p)", client);
 
     wl_list_for_each_safe(info, tmp, &client->infos, link) {
-        wl_signal_emit(&client->events.destroy, info);
+        wl_signal_emit(&info->events.destroy, info);
         wl_list_remove(&info->link);
         free(info);
     }
@@ -299,7 +301,5 @@ display_policy_bind(struct wl_client *wl_client, void *data, uint32_t version,
     wl_resource_set_implementation(client->resource, &display_policy_impl, client,
             _tizen_display_policy_client_handle_destroy);
 
-    wl_signal_init(&client->events.destroy);
-
     wl_list_insert(&display_policy->clients, &client->link);
 }
index 3c15f23b31f1f5fb24e9e08abe2de6903f6b51bd..4a05c609c195607c102c0284ed081f73acb19b4e 100644 (file)
@@ -35,10 +35,6 @@ struct ds_tizen_global_resource_client
 
     struct wl_list infos;
 
-    struct {
-        struct wl_signal destroy;
-    } events;
-
     struct wl_list link; // ds_tizen_global_resource::clients
 };
 
@@ -52,6 +48,10 @@ struct ds_tizen_global_resource_info
 
     uint32_t universal_id;
 
+    struct {
+        struct wl_signal destroy;
+    } events;
+
     struct wl_list link; // ds_tizen_global_resource_client::infos
 };
 
@@ -122,7 +122,7 @@ ds_tizen_global_resource_info_add_destroy_listener(
         struct ds_tizen_global_resource_info *info,
         struct wl_listener *listener)
 {
-    wl_signal_add(&info->client->events.destroy, listener);
+    wl_signal_add(&info->events.destroy, listener);
 }
 
 WL_EXPORT struct ds_surface *
@@ -174,6 +174,8 @@ tizen_global_resource_client_get_info(
     info->client = client;
     info->surface = surface;
 
+    wl_signal_init(&info->events.destroy);
+
     wl_list_insert(&client->infos, &info->link);
 
     return info;
@@ -215,7 +217,7 @@ _tizen_surface_handle_destroy(struct wl_resource *resource)
 
     ds_inf("_tizen_surface_handle_destroy (info:%p)", info);
 
-    wl_signal_emit(&info->client->events.destroy, info);
+    wl_signal_emit(&info->events.destroy, info);
     wl_list_remove(&info->link);
     free(info);
 }
@@ -296,7 +298,7 @@ _tizen_global_resource_client_handle_destroy(struct wl_resource *resource)
     ds_inf("_tizen_global_resource_client_handle_destroy (client:%p)", client);
 
     wl_list_for_each_safe(info, tmp, &client->infos, link) {
-        wl_signal_emit(&info->client->events.destroy, info);
+        wl_signal_emit(&info->events.destroy, info);
         wl_list_remove(&info->link);
         free(info);
     }
@@ -339,7 +341,5 @@ resource_bind(struct wl_client *wl_client, void *data, uint32_t version,
     wl_resource_set_implementation(client->resource, &surface_impl, client,
             _tizen_global_resource_client_handle_destroy);
 
-    wl_signal_init(&client->events.destroy);
-
     wl_list_insert(&global_resource->clients, &client->link);
 }
index 378794ff2a0d9ac190463e6771d9d95b77df9cb3..9e8e407760dc829175b44da6ce36fa4bed65e17f 100644 (file)
@@ -33,10 +33,6 @@ struct ds_tizen_memory_flusher_client
 
     struct wl_list infos;
 
-    struct {
-        struct wl_signal destroy;
-    } events;
-
     struct wl_list link; // ds_tizen_memory_flusher::clients
 };
 
@@ -48,6 +44,10 @@ struct ds_tizen_memory_flusher_info
 
     struct ds_surface *surface;
 
+    struct {
+        struct wl_signal destroy;
+    } events;
+
     struct wl_list link; // ds_tizen_memory_flusher_client::infos
 };
 
@@ -118,7 +118,7 @@ ds_tizen_memory_flusher_info_add_destroy_listener(
         struct ds_tizen_memory_flusher_info *info,
         struct wl_listener *listener)
 {
-    wl_signal_add(&info->client->events.destroy, listener);
+    wl_signal_add(&info->events.destroy, listener);
 }
 
 WL_EXPORT struct ds_surface *
@@ -185,6 +185,8 @@ tizen_memory_flusher_client_get_info(struct ds_tizen_memory_flusher_client *clie
     info->client = client;
     info->surface = surface;
 
+    wl_signal_init(&info->events.destroy);
+
     wl_list_insert(&client->infos, &info->link);
 
     return info;
@@ -226,7 +228,7 @@ _tizen_memory_flusher_info_handle_destroy(struct wl_resource *resource)
 
     ds_inf("_tizen_memory_flusher_info_handle_destroy (info:%p)", info);
 
-    wl_signal_emit(&info->client->events.destroy, info);
+    wl_signal_emit(&info->events.destroy, info);
     wl_list_remove(&info->link);
     free(info);
 }
@@ -302,7 +304,7 @@ _tizen_memory_flusher_client_handle_destroy(struct wl_resource *resource)
     ds_inf("_tizen_memory_flusher_client_handle_destroy (client:%p)", client);
 
     wl_list_for_each_safe(info, tmp, &client->infos, link) {
-        wl_signal_emit(&client->events.destroy, info);
+        wl_signal_emit(&info->events.destroy, info);
         wl_list_remove(&info->link);
         free(info);
     }
@@ -345,7 +347,5 @@ memory_flusher_bind(struct wl_client *wl_client, void *data, uint32_t version,
     wl_resource_set_implementation(client->resource, &memory_flusher_impl, client,
             _tizen_memory_flusher_client_handle_destroy);
 
-    wl_signal_init(&client->events.destroy);
-
     wl_list_insert(&memory_flusher->clients, &client->link);
 }
index b87e65eb8ac9e8f06b56f09af03331d92e7203e9..bcd320d975fe9da5dc3d2175d2f879be6ffaf82f 100644 (file)
@@ -33,10 +33,6 @@ struct ds_tizen_renderer_client
 
     struct wl_list infos;
 
-    struct {
-        struct wl_signal destroy;
-    } events;
-
     struct wl_list link; // ds_tizen_renderer::clients
 };
 
@@ -48,6 +44,10 @@ struct ds_tizen_renderer_info
 
     struct ds_surface *surface;
 
+    struct {
+        struct wl_signal destroy;
+    } events;
+
     struct wl_list link; // ds_tizen_renderer_client::infos
 };
 
@@ -118,7 +118,7 @@ ds_tizen_renderer_info_add_destroy_listener(
         struct ds_tizen_renderer_info *info,
         struct wl_listener *listener)
 {
-    wl_signal_add(&info->client->events.destroy, listener);
+    wl_signal_add(&info->events.destroy, listener);
 }
 
 WL_EXPORT struct ds_surface *
@@ -168,6 +168,8 @@ tizen_renderer_client_get_info(struct ds_tizen_renderer_client *client,
     info->client = client;
     info->surface = surface;
 
+    wl_signal_init(&info->events.destroy);
+
     wl_list_insert(&client->infos, &info->link);
 
     return info;
@@ -209,7 +211,7 @@ _tizen_renderer_info_handle_destroy(struct wl_resource *resource)
 
     ds_inf("_tizen_renderer_info_handle_destroy (info:%p)", info);
 
-    wl_signal_emit(&info->client->events.destroy, info);
+    wl_signal_emit(&info->events.destroy, info);
     wl_list_remove(&info->link);
     free(info);
 }
@@ -285,7 +287,7 @@ _tizen_renderer_client_handle_destroy(struct wl_resource *resource)
     ds_inf("_tizen_renderer_client_handle_destroy (client:%p)", client);
 
     wl_list_for_each_safe(info, tmp, &client->infos, link) {
-        wl_signal_emit(&client->events.destroy, info);
+        wl_signal_emit(&info->events.destroy, info);
         wl_resource_destroy(info->resource);
     }
 
@@ -327,7 +329,5 @@ renderer_bind(struct wl_client *wl_client, void *data, uint32_t version,
     wl_resource_set_implementation(client->resource, &renderer_impl, client,
             _tizen_renderer_client_handle_destroy);
 
-    wl_signal_init(&client->events.destroy);
-
     wl_list_insert(&renderer->clients, &client->link);
 }
index e4ddb6b1396c2840d08d0f4f9fb84a12b70f4561..656347ee9b65b1884d1e0ae497cf6d771da0c5c8 100644 (file)
@@ -33,10 +33,6 @@ struct ds_tizen_screen_rotation_client
 
     struct wl_list infos;
 
-    struct {
-        struct wl_signal destroy;
-    } events;
-
     struct wl_list link; // ds_tizen_screen_rotation::clients
 };
 
@@ -46,6 +42,10 @@ struct ds_tizen_screen_rotation_info
 
     struct ds_surface *surface;
 
+    struct {
+        struct wl_signal destroy;
+    } events;
+
     struct wl_list link; // ds_tizen_screen_rotation_client::infos
 };
 
@@ -118,7 +118,7 @@ ds_tizen_screen_rotation_info_add_destroy_listener(
         struct ds_tizen_screen_rotation_info *info,
         struct wl_listener *listener)
 {
-    wl_signal_add(&info->client->events.destroy, listener);
+    wl_signal_add(&info->events.destroy, listener);
 }
 
 WL_EXPORT struct ds_surface *
@@ -169,6 +169,8 @@ tizen_screen_rotation_client_get_info(struct ds_tizen_screen_rotation_client *cl
     info->client = client;
     info->surface = surface;
 
+    wl_signal_init(&info->events.destroy);
+
     wl_list_insert(&client->infos, &info->link);
 
     return info;
@@ -245,7 +247,7 @@ _tizen_screen_rotation_client_handle_destroy(struct wl_resource *resource)
     ds_inf("_tizen_screen_rotation_client_handle_destroy (client:%p)", client);
 
     wl_list_for_each_safe(info, tmp, &client->infos, link) {
-        wl_signal_emit(&client->events.destroy, info);
+        wl_signal_emit(&info->events.destroy, info);
         wl_list_remove(&info->link);
         free(info);
     }
@@ -288,7 +290,5 @@ screen_rotation_bind(struct wl_client *wl_client, void *data, uint32_t version,
     wl_resource_set_implementation(client->resource, &screen_rotation_impl, client,
             _tizen_screen_rotation_client_handle_destroy);
 
-    wl_signal_init(&client->events.destroy);
-
     wl_list_insert(&screen_rotation->clients, &client->link);
 }