forked from enlightenment/efl
efl/evas: Fix XCB/Xlib crash when closing applications
We need to wait draw threads finishing their stuff before freeing canvas. Signed-off-by: Paulo Alcantara <pcacjr@profusion.mobi> SVN revision: 81395
This commit is contained in:
parent
bb50f86bc5
commit
19a52f4efd
|
@ -152,8 +152,7 @@ evas_free(Evas *eo_e)
|
||||||
MAGIC_CHECK(eo_e, Evas, MAGIC_EVAS);
|
MAGIC_CHECK(eo_e, Evas, MAGIC_EVAS);
|
||||||
return;
|
return;
|
||||||
MAGIC_CHECK_END();
|
MAGIC_CHECK_END();
|
||||||
Evas_Public_Data *e = eo_data_get(eo_e, EVAS_CLASS);
|
evas_sync(eo_e);
|
||||||
e->requested_free = EINA_TRUE;
|
|
||||||
eo_unref(eo_e);
|
eo_unref(eo_e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1146,7 +1145,7 @@ static const Eo_Op_Description op_desc[] = {
|
||||||
EO_OP_DESCRIPTION(EVAS_CANVAS_SUB_ID_RENDER, "Force renderization of the given canvas."),
|
EO_OP_DESCRIPTION(EVAS_CANVAS_SUB_ID_RENDER, "Force renderization of the given canvas."),
|
||||||
EO_OP_DESCRIPTION(EVAS_CANVAS_SUB_ID_NORENDER, "Update the canvas internal objects but not triggering immediate."),
|
EO_OP_DESCRIPTION(EVAS_CANVAS_SUB_ID_NORENDER, "Update the canvas internal objects but not triggering immediate."),
|
||||||
EO_OP_DESCRIPTION(EVAS_CANVAS_SUB_ID_RENDER_IDLE_FLUSH, "Make the canvas discard internally cached data used for rendering."),
|
EO_OP_DESCRIPTION(EVAS_CANVAS_SUB_ID_RENDER_IDLE_FLUSH, "Make the canvas discard internally cached data used for rendering."),
|
||||||
EO_OP_DESCRIPTION(EVAS_CANVAS_SUB_ID_SYNC, "? evas_sync"),
|
EO_OP_DESCRIPTION(EVAS_CANVAS_SUB_ID_SYNC, "Force evas render to be synchronized (in case it is asynchronous)."),
|
||||||
EO_OP_DESCRIPTION(EVAS_CANVAS_SUB_ID_RENDER_DUMP, "Make the canvas discard as much data as possible used by the engine at"),
|
EO_OP_DESCRIPTION(EVAS_CANVAS_SUB_ID_RENDER_DUMP, "Make the canvas discard as much data as possible used by the engine at"),
|
||||||
EO_OP_DESCRIPTION(EVAS_CANVAS_SUB_ID_OBJECT_BOTTOM_GET, "Get the lowest (stacked) Evas object on the canvas e."),
|
EO_OP_DESCRIPTION(EVAS_CANVAS_SUB_ID_OBJECT_BOTTOM_GET, "Get the lowest (stacked) Evas object on the canvas e."),
|
||||||
EO_OP_DESCRIPTION(EVAS_CANVAS_SUB_ID_OBJECT_TOP_GET, "Get the highest (stacked) Evas object on the canvas e."),
|
EO_OP_DESCRIPTION(EVAS_CANVAS_SUB_ID_OBJECT_TOP_GET, "Get the highest (stacked) Evas object on the canvas e."),
|
||||||
|
|
|
@ -1823,16 +1823,6 @@ evas_render_wakeup(Evas *eo_e)
|
||||||
Eina_List *ret_updates = NULL;
|
Eina_List *ret_updates = NULL;
|
||||||
Evas_Public_Data *e = eo_data_get(eo_e, EVAS_CLASS);
|
Evas_Public_Data *e = eo_data_get(eo_e, EVAS_CLASS);
|
||||||
|
|
||||||
if (e->requested_free)
|
|
||||||
{
|
|
||||||
EINA_LIST_FREE(e->render.updates, ru)
|
|
||||||
{
|
|
||||||
eina_rectangle_free(ru->area);
|
|
||||||
free(ru);
|
|
||||||
}
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
|
|
||||||
EINA_LIST_FREE(e->render.updates, ru)
|
EINA_LIST_FREE(e->render.updates, ru)
|
||||||
{
|
{
|
||||||
/* punch rect out */
|
/* punch rect out */
|
||||||
|
@ -2038,8 +2028,10 @@ evas_sync(Evas *eo_e)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
_canvas_sync(Eo *eo_e EINA_UNUSED, void *_pd EINA_UNUSED, va_list *list EINA_UNUSED)
|
_canvas_sync(Eo *eo_e, void *_pd EINA_UNUSED, va_list *list EINA_UNUSED)
|
||||||
{
|
{
|
||||||
|
Evas_Public_Data *e = eo_data_get(eo_e, EVAS_CLASS);
|
||||||
|
evas_render_rendering_wait(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -421,7 +421,6 @@ struct _Evas_Public_Data
|
||||||
unsigned char focus : 1;
|
unsigned char focus : 1;
|
||||||
Eina_Bool is_frozen : 1;
|
Eina_Bool is_frozen : 1;
|
||||||
Eina_Bool rendering : 1;
|
Eina_Bool rendering : 1;
|
||||||
Eina_Bool requested_free : 1;
|
|
||||||
|
|
||||||
Eina_List *touch_points;
|
Eina_List *touch_points;
|
||||||
Eina_List *devices;
|
Eina_List *devices;
|
||||||
|
|
Loading…
Reference in New Issue