[PATCH] ivi-shell: Remove all surface transitions when it is being removed.

mateuszx.potrola at intel.com mateuszx.potrola at intel.com
Wed Mar 9 09:13:26 UTC 2016


From: Mateusz Polrola <mateuszx.potrola at intel.com>

If surface transitions are not removed when surface is being removed, it
can lead to crash later when transition will finish, as it will try to
reference already freed memory.
This change exposes function that can remove all existing transitions
for given surface and it is being called during surface cleanup.

Signed-off-by: Mateusz Polrola <mateuszx.potrola at intel.com>
---
 ivi-shell/ivi-layout-private.h    |  3 +++
 ivi-shell/ivi-layout-transition.c | 16 ++++++++++++++++
 ivi-shell/ivi-layout.c            |  2 ++
 3 files changed, 21 insertions(+)

diff --git a/ivi-shell/ivi-layout-private.h b/ivi-shell/ivi-layout-private.h
index 3a23ef4..8c847e7 100644
--- a/ivi-shell/ivi-layout-private.h
+++ b/ivi-shell/ivi-layout-private.h
@@ -158,6 +158,9 @@ ivi_layout_transition_fade_layer(struct ivi_layout_layer *layer,
 int32_t
 is_surface_transition(struct ivi_layout_surface *surface);
 
+void
+ivi_layout_remove_all_surface_transitions(struct ivi_layout_surface *surface);
+
 /**
  * methods of interaction between ivi-shell with ivi-layout
  */
diff --git a/ivi-shell/ivi-layout-transition.c b/ivi-shell/ivi-layout-transition.c
index 3b613a5..ed11999 100644
--- a/ivi-shell/ivi-layout-transition.c
+++ b/ivi-shell/ivi-layout-transition.c
@@ -99,6 +99,22 @@ is_surface_transition(struct ivi_layout_surface *surface)
 	return 0;
 }
 
+void
+ivi_layout_remove_all_surface_transitions(struct ivi_layout_surface *surface)
+{
+	struct ivi_layout *layout = get_instance();
+	struct transition_node *node;
+	struct transition_node *tmp;
+	struct ivi_layout_transition *tran;
+
+	wl_list_for_each_safe(node, tmp, &layout->transitions->transition_list, link) {
+		tran = node->transition;
+		if (tran->is_transition_func(tran->private_data, surface)) {
+			layout_transition_destroy(tran);
+		}
+	};
+}
+
 static void
 tick_transition(struct ivi_layout_transition *transition, uint32_t timestamp)
 {
diff --git a/ivi-shell/ivi-layout.c b/ivi-shell/ivi-layout.c
index c324b5e..61897ef 100644
--- a/ivi-shell/ivi-layout.c
+++ b/ivi-shell/ivi-layout.c
@@ -241,6 +241,8 @@ ivi_layout_surface_destroy(struct ivi_layout_surface *ivisurf)
 
 	wl_signal_emit(&layout->surface_notification.removed, ivisurf);
 
+	ivi_layout_remove_all_surface_transitions(ivisurf);
+
 	remove_configured_listener(ivisurf);
 
 	ivi_layout_surface_remove_notification(ivisurf);
-- 
2.1.0

--------------------------------------------------------------
Intel Research and Development Ireland Limited
Registered in Ireland
Registered Office: Collinstown Industrial Park, Leixlip, County Kildare
Registered Number: 308263


This e-mail and any attachments may contain confidential material for the sole
use of the intended recipient(s). Any review or distribution by others is
strictly prohibited. If you are not the intended recipient, please contact the
sender and delete all copies.



More information about the wayland-devel mailing list