From: Nobuhiko Tanibata <nobuhiko_tanib...@xddp.denso.co.jp> if a controller calls ivi_layout_layer_create_with_demenstion with a ID which is already created before, the API returns exist ivi_layer. However addtionally, it shall count up ref count to destroy ivi_layer when ref count is 0. The previous code will destroy ivi_layer immediately even if the other code still refers ivi_layer.
Signed-off-by: Nobuhiko Tanibata <nobuhiko_tanib...@xddp.denso.co.jp> Acked-by: Pekka Paalanen <pekka.paala...@collabora.co.uk> --- ivi-shell/ivi-layout-private.h | 2 ++ ivi-shell/ivi-layout.c | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/ivi-shell/ivi-layout-private.h b/ivi-shell/ivi-layout-private.h index 8b61963..cf2db7d 100644 --- a/ivi-shell/ivi-layout-private.h +++ b/ivi-shell/ivi-layout-private.h @@ -88,6 +88,8 @@ struct ivi_layout_layer { struct wl_list surface_list; struct wl_list link; } order; + + int32_t ref_count; }; struct ivi_layout { diff --git a/ivi-shell/ivi-layout.c b/ivi-shell/ivi-layout.c index 079b3e3..d7108b6 100644 --- a/ivi-shell/ivi-layout.c +++ b/ivi-shell/ivi-layout.c @@ -1820,6 +1820,7 @@ ivi_layout_layer_create_with_dimension(uint32_t id_layer, ivilayer = get_layer(&layout->layer_list, id_layer); if (ivilayer != NULL) { weston_log("id_layer is already created\n"); + ++ivilayer->ref_count; return ivilayer; } @@ -1829,6 +1830,7 @@ ivi_layout_layer_create_with_dimension(uint32_t id_layer, return NULL; } + ivilayer->ref_count = 1; wl_list_init(&ivilayer->link); wl_signal_init(&ivilayer->property_changed); wl_list_init(&ivilayer->screen_list); @@ -1874,6 +1876,9 @@ ivi_layout_layer_remove(struct ivi_layout_layer *ivilayer) return; } + if (--ivilayer->ref_count > 0) + return; + wl_signal_emit(&layout->layer_notification.removed, ivilayer); clear_surface_pending_list(ivilayer); -- 1.8.3.1 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel