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>
This commit is contained in:
committed by
Pekka Paalanen
parent
680984234a
commit
4b601e152e
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user