From 5e3db3bef8a618c29bd25a62d66843fc1799117b Mon Sep 17 00:00:00 2001 From: Hosang Kim Date: Thu, 24 Oct 2019 07:27:37 +0000 Subject: [PATCH] efl_message: add pending queue for filtering message. Sometimes message is appended when message queue is walking. In this case, newly added messages are not filtered. So I add message pending queue for filtering message. Reviewed-by: Cedric BAIL Differential Revision: https://phab.enlightenment.org/D10459 --- src/lib/ecore/ecore_private.h | 1 + src/lib/ecore/efl_loop.c | 8 ++++++++ src/lib/ecore/efl_loop_message_handler.c | 12 ++++++++++-- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/lib/ecore/ecore_private.h b/src/lib/ecore/ecore_private.h index de3b47b60c..f56cbae30a 100644 --- a/src/lib/ecore/ecore_private.h +++ b/src/lib/ecore/ecore_private.h @@ -147,6 +147,7 @@ struct _Efl_Loop_Data Eina_List *thread_children; Eina_Inlist *message_queue; + Eina_Inlist *message_pending_queue; unsigned int message_walking; unsigned int throttle; diff --git a/src/lib/ecore/efl_loop.c b/src/lib/ecore/efl_loop.c index e40dbef3f0..9a36d74658 100644 --- a/src/lib/ecore/efl_loop.c +++ b/src/lib/ecore/efl_loop.c @@ -621,6 +621,14 @@ _efl_loop_message_process(Eo *obj, Efl_Loop_Data *pd) } else free(msg); } + + while (pd->message_pending_queue) + { + msg = (Message *)pd->message_pending_queue; + pd->message_pending_queue = eina_inlist_remove(pd->message_pending_queue, + pd->message_pending_queue); + pd->message_queue = eina_inlist_append(pd->message_queue, EINA_INLIST_GET(msg)); + } } return EINA_TRUE; } diff --git a/src/lib/ecore/efl_loop_message_handler.c b/src/lib/ecore/efl_loop_message_handler.c index 05ecdbcab2..e243c1713e 100644 --- a/src/lib/ecore/efl_loop_message_handler.c +++ b/src/lib/ecore/efl_loop_message_handler.c @@ -54,8 +54,16 @@ _efl_loop_message_handler_message_send(Eo *obj, Efl_Loop_Message_Handler_Data *p { msg->handler = obj; msg->message = message; - pd->loop_data->message_queue = eina_inlist_append - (pd->loop_data->message_queue, EINA_INLIST_GET(msg)); + if (pd->loop_data->message_walking > 0) + { + pd->loop_data->message_pending_queue = eina_inlist_append + (pd->loop_data->message_pending_queue, EINA_INLIST_GET(msg)); + } + else + { + pd->loop_data->message_queue = eina_inlist_append + (pd->loop_data->message_queue, EINA_INLIST_GET(msg)); + } _efl_loop_message_send_info_set(message, EINA_INLIST_GET(msg), pd->loop, pd->loop_data); return;