ivi-shell: bugfix, add ref_count to ivi_layout_layer

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_TANIBATA@xddp.denso.co.jp>
Acked-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
dev
Nobuhiko Tanibata 10 years ago committed by Pekka Paalanen
parent 680984234a
commit 4b601e152e
  1. 2
      ivi-shell/ivi-layout-private.h
  2. 5
      ivi-shell/ivi-layout.c

@ -88,6 +88,8 @@ struct ivi_layout_layer {
struct wl_list surface_list; struct wl_list surface_list;
struct wl_list link; struct wl_list link;
} order; } order;
int32_t ref_count;
}; };
struct ivi_layout { struct ivi_layout {

@ -1820,6 +1820,7 @@ ivi_layout_layer_create_with_dimension(uint32_t id_layer,
ivilayer = get_layer(&layout->layer_list, id_layer); ivilayer = get_layer(&layout->layer_list, id_layer);
if (ivilayer != NULL) { if (ivilayer != NULL) {
weston_log("id_layer is already created\n"); weston_log("id_layer is already created\n");
++ivilayer->ref_count;
return ivilayer; return ivilayer;
} }
@ -1829,6 +1830,7 @@ ivi_layout_layer_create_with_dimension(uint32_t id_layer,
return NULL; return NULL;
} }
ivilayer->ref_count = 1;
wl_list_init(&ivilayer->link); wl_list_init(&ivilayer->link);
wl_signal_init(&ivilayer->property_changed); wl_signal_init(&ivilayer->property_changed);
wl_list_init(&ivilayer->screen_list); wl_list_init(&ivilayer->screen_list);
@ -1874,6 +1876,9 @@ ivi_layout_layer_remove(struct ivi_layout_layer *ivilayer)
return; return;
} }
if (--ivilayer->ref_count > 0)
return;
wl_signal_emit(&layout->layer_notification.removed, ivilayer); wl_signal_emit(&layout->layer_notification.removed, ivilayer);
clear_surface_pending_list(ivilayer); clear_surface_pending_list(ivilayer);

Loading…
Cancel
Save