tinyds: removes wl_listeners when it's destroied 09/281909/1
authorduna.oh <duna.oh@samsung.com>
Thu, 22 Sep 2022 02:06:42 +0000 (11:06 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Fri, 23 Sep 2022 06:03:46 +0000 (15:03 +0900)
To fix segfault error, wl_listeners should be removed properly.

Change-Id: Ida1a6c8c51eefa08932c22fb6296635532f3edb7

examples/tinyds-tdm.c

index a915c21..b64271e 100644 (file)
@@ -288,11 +288,10 @@ struct tinyds_text_input {
 
     struct wl_list input_methods;
 
-    struct wl_listener destroy;
     struct wl_listener mgr_destroy;
-
     struct wl_listener new_text_input;
 
+    struct wl_listener destroy;
     struct wl_listener text_input_activate;
     struct wl_listener text_input_deactivate;
     struct wl_listener text_input_reset;
@@ -1946,22 +1945,10 @@ text_input_mgr_handle_destroy(struct wl_listener *listener, void *data)
     text_input = wl_container_of(listener, text_input, mgr_destroy);
 
     wl_list_remove(&text_input->mgr_destroy.link);
-    wl_list_remove(&text_input->destroy.link);
-
     wl_list_remove(&text_input->new_text_input.link);
 
-    wl_list_remove(&text_input->text_input_activate.link);
-    wl_list_remove(&text_input->text_input_deactivate.link);
-    wl_list_remove(&text_input->text_input_reset.link);
-    wl_list_remove(&text_input->text_input_set_content_type.link);
-    wl_list_remove(&text_input->text_input_invoke_action.link);
-    wl_list_remove(&text_input->text_input_commit_state.link);
-    wl_list_remove(&text_input->text_input_set_preferred_language.link);
-
     server = text_input->server;
     server->text_input = NULL;
-
-    free(text_input);
 }
 
 static void
@@ -1974,6 +1961,15 @@ text_input_handle_destroy(struct wl_listener *listener, void *data)
     text_input = wl_container_of(listener, text_input, destroy);
 
     wl_list_remove(&text_input->destroy.link);
+    wl_list_remove(&text_input->text_input_activate.link);
+    wl_list_remove(&text_input->text_input_deactivate.link);
+    wl_list_remove(&text_input->text_input_reset.link);
+    wl_list_remove(&text_input->text_input_set_content_type.link);
+    wl_list_remove(&text_input->text_input_invoke_action.link);
+    wl_list_remove(&text_input->text_input_commit_state.link);
+    wl_list_remove(&text_input->text_input_set_preferred_language.link);
+
+    free(text_input);
 }
 
 static void
@@ -2450,9 +2446,9 @@ add_new_text_input(struct tinyds_server *server)
 
     wl_list_init(&text_input->input_methods);
 
-    text_input->destroy.notify = text_input_mgr_handle_destroy;
+    text_input->mgr_destroy.notify = text_input_mgr_handle_destroy;
     ds_tizen_text_input_manager_add_destroy_listener(text_input->text_input_mgr,
-            &text_input->destroy);
+            &text_input->mgr_destroy);
 
     text_input->new_text_input.notify = text_input_mgr_handle_new_text_input;
     ds_tizen_text_input_manager_add_new_text_input_listener(text_input->text_input_mgr,
@@ -2595,6 +2591,7 @@ visibility_handle_destroy(struct wl_listener *listener, void *data)
 
     ds_inf("Policy Visibility(%p) destroy", visibility);
 
+    wl_list_remove(&visibility->destroy.link);
     wl_list_remove(&visibility->link);
     free(visibility);
 }
@@ -2608,6 +2605,8 @@ position_handle_destroy(struct wl_listener *listener, void *data)
 
     ds_inf("Policy Position(%p) destroy", position);
 
+    wl_list_remove(&position->destroy.link);
+    wl_list_remove(&position->set.link);
     wl_list_remove(&position->link);
     free(position);
 }
@@ -2633,6 +2632,7 @@ subsurface_watcher_handle_destroy(struct wl_listener *listener, void *data)
 
     ds_inf("Policy Subsurface_Watcher(%p) destroy", subsurface_watcher);
 
+    wl_list_remove(&subsurface_watcher->destroy.link);
     wl_list_remove(&subsurface_watcher->link);
     free(subsurface_watcher);
 }
@@ -2646,6 +2646,38 @@ policy_surface_handle_destroy(struct wl_listener *listener, void *data)
 
     ds_inf("Policy Info(%p) destroy", policy_surface);
 
+    wl_list_remove(&policy_surface->destroy.link);
+    wl_list_remove(&policy_surface->new_visibility.link);
+    wl_list_remove(&policy_surface->new_position.link);
+    wl_list_remove(&policy_surface->activate.link);
+    wl_list_remove(&policy_surface->raise.link);
+    wl_list_remove(&policy_surface->lower.link);
+    wl_list_remove(&policy_surface->set_focus_skip.link);
+    wl_list_remove(&policy_surface->unset_focus_skip.link);
+    wl_list_remove(&policy_surface->set_role.link);
+    wl_list_remove(&policy_surface->set_window_type.link);
+    wl_list_remove(&policy_surface->set_conformant.link);
+    wl_list_remove(&policy_surface->unset_conformant.link);
+    wl_list_remove(&policy_surface->get_conformant.link);
+    wl_list_remove(&policy_surface->set_notification_level.link);
+    wl_list_remove(&policy_surface->set_window_screen_mode.link);
+    wl_list_remove(&policy_surface->get_subsurface.link);
+    wl_list_remove(&policy_surface->iconify.link);
+    wl_list_remove(&policy_surface->uniconify.link);
+    wl_list_remove(&policy_surface->add_aux_hint.link);
+    wl_list_remove(&policy_surface->change_aux_hint.link);
+    wl_list_remove(&policy_surface->delete_aux_hint.link);
+    wl_list_remove(&policy_surface->get_supported_aux_hints.link);
+    wl_list_remove(&policy_surface->set_floating_mode.link);
+    wl_list_remove(&policy_surface->unset_floating_mode.link);
+    wl_list_remove(&policy_surface->set_stack_mode.link);
+    wl_list_remove(&policy_surface->new_subsurface_watcher.link);
+    wl_list_remove(&policy_surface->set_parent.link);
+    wl_list_remove(&policy_surface->ack_conformant_region.link);
+    wl_list_remove(&policy_surface->set_video.link);
+    wl_list_remove(&policy_surface->show.link);
+    wl_list_remove(&policy_surface->hide.link);
+    wl_list_remove(&policy_surface->set_parent_with_below.link);
     wl_list_remove(&policy_surface->link);
     free(policy_surface);
 }
@@ -3074,6 +3106,20 @@ policy_handle_destroy(struct wl_listener *listener, void *data)
 
     ds_inf("Policy(%p) destroy", policy);
 
+    wl_list_remove(&policy->destroy.link);
+    wl_list_remove(&policy->new_surface.link);
+    wl_list_remove(&policy->activate_below_by_univeral_id.link);
+    wl_list_remove(&policy->lower_by_universal_id.link);
+    wl_list_remove(&policy->set_transient_for.link);
+    wl_list_remove(&policy->unset_transient_for.link);
+    wl_list_remove(&policy->place_subsurface_below_parent.link);
+    wl_list_remove(&policy->set_subsurface_stand_alone.link);
+    wl_list_remove(&policy->set_background_state.link);
+    wl_list_remove(&policy->unset_background_state.link);
+    wl_list_remove(&policy->add_activate_above_by_universal_id.link);
+    wl_list_remove(&policy->set_appid.link);
+    wl_list_remove(&policy->set_transient_for_below.link);
+
     free(policy);
 }
 
@@ -3422,7 +3468,7 @@ new_policy(struct tinyds_server *server)
 
     policy->set_background_state.notify = policy_handle_set_background_state;
     ds_tizen_policy_add_set_background_state_listener(policy->policy,
-        &policy->destroy);
+        &policy->set_background_state);
 
     policy->unset_background_state.notify = policy_handle_unset_background_state;
     ds_tizen_policy_add_unset_background_state_listener(policy->policy,