evas/render: Avoid race when sending render data and updates_cb

Signed-off-by: Paulo Alcantara <pcacjr@profusion.mobi>



SVN revision: 81303
This commit is contained in:
Paulo Alcantara 2012-12-18 20:20:45 +00:00 committed by Leandro Pereira
parent b5197eb128
commit 6483c8d1e6
1 changed files with 12 additions and 7 deletions

View File

@ -57,7 +57,7 @@ struct _Render_Updates
};
static Eina_Bool
evas_render_updates_internal(Evas *eo_e, unsigned char make_updates, unsigned char do_draw, Evas_Render_Done_Cb done_func, void *done_data, Eina_Bool do_async);
evas_render_updates_internal(Evas *eo_e, unsigned char make_updates, unsigned char do_draw, Evas_Render_Done_Cb done_func, void *done_data, Evas_Event_Cb updates_func, void *updates_data, Eina_Bool do_async);
EAPI void
evas_damage_rectangle_add(Evas *eo_e, int x, int y, int w, int h)
@ -1312,6 +1312,7 @@ evas_render_updates_internal(Evas *eo_e,
unsigned char do_draw,
Evas_Render_Done_Cb done_func,
void *done_data,
Evas_Event_Cb updates_func, void *updates_data,
Eina_Bool do_async)
{
Evas_Object *eo_obj;
@ -1338,7 +1339,12 @@ evas_render_updates_internal(Evas *eo_e,
if (e->rendering) return EINA_FALSE;
e->rendering = EINA_TRUE;
if (do_async) eo_ref(eo_e);
if (do_async)
{
eo_ref(eo_e);
e->render.data = updates_data;
e->render.updates_cb = updates_func;
}
#ifdef EVAS_CSERVE2
if (evas_cserve2_use_get())
@ -1905,9 +1911,8 @@ _canvas_render_async(Eo *eo_e, void *_pd, va_list *list)
Eina_Bool *ret = va_arg(*list, Eina_Bool *);
Evas_Public_Data *e = _pd;
e->render.updates_cb = func;
e->render.data = data;
*ret = evas_render_updates_internal(eo_e, 1, 1, evas_render_pipe_wakeup, e, EINA_TRUE);
*ret = evas_render_updates_internal(eo_e, 1, 1, evas_render_pipe_wakeup,
e, func, data, EINA_TRUE);
}
EAPI Eina_List *
@ -1929,8 +1934,8 @@ evas_render_updates_internal_wait(Evas *eo_e,
Eina_List *ret = NULL;
Evas_Public_Data *e = eo_data_get(eo_e, EVAS_CLASS);
if (!evas_render_updates_internal(eo_e, make_updates, do_draw, NULL, NULL,
EINA_FALSE))
if (!evas_render_updates_internal(eo_e, make_updates, do_draw, NULL,
NULL, NULL, NULL, EINA_FALSE))
return NULL;
ret = e->render.updates;