diff --git a/src/lib/evas/canvas/evas_render.c b/src/lib/evas/canvas/evas_render.c index b04d606ed0..4fbe9e2a62 100644 --- a/src/lib/evas/canvas/evas_render.c +++ b/src/lib/evas/canvas/evas_render.c @@ -2235,6 +2235,7 @@ _canvas_render_dump(Eo *eo_e EINA_UNUSED, void *_pd, va_list *list EINA_UNUSED) Evas_Public_Data *e = _pd; Evas_Layer *lay; + evas_thread_queue_block(); evas_render_rendering_wait(e); evas_cache_async_freeze(); @@ -2263,6 +2264,7 @@ _canvas_render_dump(Eo *eo_e EINA_UNUSED, void *_pd, va_list *list EINA_UNUSED) GC_ALL(evas_object_image_load_opts_cow); GC_ALL(evas_object_image_state_cow); evas_cache_async_thaw(); + evas_thread_queue_unblock(); } void diff --git a/src/lib/evas/common/evas_thread_render.c b/src/lib/evas/common/evas_thread_render.c index f37f43a6f7..3474469450 100644 --- a/src/lib/evas/common/evas_thread_render.c +++ b/src/lib/evas/common/evas_thread_render.c @@ -4,6 +4,7 @@ static Eina_Thread evas_thread_worker; static Eina_Condition evas_thread_queue_condition; +static Eina_Lock evas_thread_block_lock; static Eina_Lock evas_thread_queue_lock; static Eina_Bool evas_thread_queue_ready = EINA_FALSE; static Eina_Inarray evas_thread_queue; @@ -55,7 +56,19 @@ evas_thread_queue_flush(Evas_Thread_Command_Cb cb, void *data) evas_thread_queue_append(cb, data, EINA_TRUE); } -static void* +EAPI void +evas_thread_queue_block(void) +{ + eina_lock_take(&evas_thread_block_lock); +} + +EAPI void +evas_thread_queue_unblock(void) +{ + eina_lock_release(&evas_thread_block_lock); +} + +static void * evas_thread_worker_func(void *data EINA_UNUSED, Eina_Thread thread EINA_UNUSED) { while (1) @@ -83,6 +96,8 @@ evas_thread_worker_func(void *data EINA_UNUSED, Eina_Thread thread EINA_UNUSED) continue; } + eina_lock_take(&evas_thread_block_lock); + cmd = evas_thread_queue.members; evas_thread_queue.members = evas_thread_queue_cache; evas_thread_queue_cache = cmd; @@ -109,6 +124,7 @@ evas_thread_worker_func(void *data EINA_UNUSED, Eina_Thread thread EINA_UNUSED) cmd++; len--; } + eina_lock_release(&evas_thread_block_lock); } out: @@ -128,6 +144,8 @@ evas_thread_init(void) if (!eina_lock_new(&evas_thread_queue_lock)) CRIT("Could not create draw thread lock"); + if (!eina_lock_new(&evas_thread_block_lock)) + CRIT("Could not create draw thread block lock"); if (!eina_condition_new(&evas_thread_queue_condition, &evas_thread_queue_lock)) CRIT("Could not create draw thread condition"); if (!eina_thread_create(&evas_thread_worker, EINA_THREAD_NORMAL, 0, @@ -154,6 +172,7 @@ evas_thread_shutdown(void) evas_async_events_process(); eina_thread_join(evas_thread_worker); + eina_lock_free(&evas_thread_block_lock); eina_lock_free(&evas_thread_queue_lock); eina_condition_free(&evas_thread_queue_condition); diff --git a/src/lib/evas/include/evas_common_private.h b/src/lib/evas/include/evas_common_private.h index 336b7a6231..24c9d87d4a 100644 --- a/src/lib/evas/include/evas_common_private.h +++ b/src/lib/evas/include/evas_common_private.h @@ -1253,7 +1253,9 @@ void evas_thread_init(void); void evas_thread_shutdown(void); EAPI void evas_thread_cmd_enqueue(Evas_Thread_Command_Cb cb, void *data); EAPI void evas_thread_queue_flush(Evas_Thread_Command_Cb cb, void *data); - +EAPI void evas_thread_queue_block(void); +EAPI void evas_thread_queue_unblock(void); + typedef enum _Evas_Render_Mode { EVAS_RENDER_MODE_UNDEF,