diff --git a/src/lib/evas/canvas/evas_main.c b/src/lib/evas/canvas/evas_main.c index 23d8f3215e..aefdce5090 100644 --- a/src/lib/evas/canvas/evas_main.c +++ b/src/lib/evas/canvas/evas_main.c @@ -16,8 +16,6 @@ EAPI Eina_Bool lockdebug = EINA_FALSE; EAPI int lockmax = 0; #endif -Eina_List *all_evases = NULL; - static int _evas_init_count = 0; int _evas_log_dom_global = -1; @@ -111,9 +109,6 @@ evas_shutdown(void) evas_object_image_load_opts_cow = NULL; evas_object_image_state_cow = NULL; - eina_list_free(all_evases); - all_evases = NULL; - evas_thread_shutdown(); _evas_preload_thread_shutdown(); evas_async_events_shutdown(); @@ -177,8 +172,6 @@ _constructor(Eo *eo_obj, void *class_data, va_list *list EINA_UNUSED) EVAS_ARRAY_SET(e, texts_unref_queue); #undef EVAS_ARRAY_SET - - all_evases = eina_list_append(all_evases, e); } EAPI void @@ -274,8 +267,6 @@ _destructor(Eo *eo_e, void *_pd, va_list *list EINA_UNUSED) if (e->engine.module) evas_module_unref(e->engine.module); - all_evases = eina_list_remove(all_evases, e); - eina_array_flush(&e->delete_objects); eina_array_flush(&e->active_objects); eina_array_flush(&e->restack_objects); diff --git a/src/lib/evas/canvas/evas_render.c b/src/lib/evas/canvas/evas_render.c index c350cc617b..81b8abc601 100644 --- a/src/lib/evas/canvas/evas_render.c +++ b/src/lib/evas/canvas/evas_render.c @@ -1,6 +1,7 @@ #include "evas_common_private.h" #include "evas_private.h" #include +#include #ifdef EVAS_CSERVE2 #include "evas_cs2_private.h" #endif @@ -90,6 +91,8 @@ 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); +static Eina_List *_rendering_evases = NULL; + #ifdef EVAS_RENDER_DEBUG_TIMING static double _time_get() @@ -1472,19 +1475,20 @@ evas_render_rendering_wait(Evas_Public_Data *evas) while (evas->rendering) evas_async_events_process_blocking(); } -/* syncs ALL async rendering canvases */ +/* + * Syncs ALL async rendering canvases. Must be called in the main thread. + */ void evas_render_sync(void) { - Eina_List *l; - void *d; + Evas_Public_Data *evas; - EINA_LIST_FOREACH(all_evases, l, d) - { - Evas_Public_Data *e = d; - if (!e->rendering) continue; - evas_render_rendering_wait(e); - } + if (!_rendering_evases) return; + + evas = eina_list_data_get(eina_list_last(_rendering_evases)); + evas_render_rendering_wait(evas); + + assert(_rendering_evases == NULL); } static Eina_Bool @@ -1837,6 +1841,7 @@ evas_render_updates_internal(Evas *eo_e, { eo_ref(eo_e); e->rendering = EINA_TRUE; + _rendering_evases = eina_list_append(_rendering_evases, e); evas_thread_queue_flush((Evas_Thread_Command_Cb)done_func, done_data); } @@ -2034,6 +2039,7 @@ evas_render_wakeup(Evas *eo_e) eina_array_clean(&e->texts_unref_queue); /* post rendering */ + _rendering_evases = eina_list_remove(_rendering_evases, e); e->rendering = EINA_FALSE; post.updated_area = ret_updates; diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h index f8daeafd83..5a9867b120 100644 --- a/src/lib/evas/include/evas_private.h +++ b/src/lib/evas/include/evas_private.h @@ -443,8 +443,6 @@ struct _Evas_Public_Data Eina_Bool rendering : 1; }; -extern Eina_List *all_evases; - struct _Evas_Layer { EINA_INLIST;