diff options
author | cedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33> | 2012-07-28 16:33:37 +0000 |
---|---|---|
committer | cedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33> | 2012-07-28 16:33:37 +0000 |
commit | 180612bf43aa8e33fab890cd09cfa385f3998eda (patch) | |
tree | 68572174268df891bff167fd551aee084c902be7 | |
parent | de2d1d7b422980f8ef61c8b679e915170dd8819d (diff) | |
download | edje-180612bf43aa8e33fab890cd09cfa385f3998eda.tar.gz edje-180612bf43aa8e33fab890cd09cfa385f3998eda.tar.bz2 edje-180612bf43aa8e33fab890cd09cfa385f3998eda.zip |
edje: Reduce potential reentrant issue when using edje_object_signal_emit.
git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/edje@74539 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33
-rw-r--r-- | ChangeLog | 3 | ||||
-rw-r--r-- | NEWS | 1 | ||||
-rw-r--r-- | src/lib/edje_match.c | 24 |
3 files changed, 20 insertions, 8 deletions
@@ -537,3 +537,6 @@ * Fix edje entry to extend selection to char pos/word or line when holding shift + mouse click. +2012-07-29 Cedric Bail + + * Reduce potential reentrant issue when using edje_object_signal_emit. @@ -28,6 +28,7 @@ Fixes: * Clamp image tween to never underflow also. * [entry] display preedit string even though there is no attribute * Fix shutdown of Edje_Multisense. + * Reduce potential reentrant issue when using edje_object_signal_emit. Edje 1.2.0 diff --git a/src/lib/edje_match.c b/src/lib/edje_match.c index f113f7b..375634e 100644 --- a/src/lib/edje_match.c +++ b/src/lib/edje_match.c @@ -449,7 +449,7 @@ edje_match_programs_exec_check_finals(const size_t *signal_finals, } static int -edje_match_callback_exec_check_finals(const Edje_Patterns *singal_ppat, +edje_match_callback_exec_check_finals(const Edje_Patterns *signal_ppat, const Edje_Patterns *source_ppat, const size_t *signal_finals, const size_t *source_finals, @@ -462,10 +462,14 @@ edje_match_callback_exec_check_finals(const Edje_Patterns *singal_ppat, Eina_Bool prop ) { + Edje_Signal_Callback *escb; + Eina_Array run; size_t i; size_t j; int r = 1; + eina_array_step_set(&run, sizeof (Eina_Array), 4); + for (i = 0; i < signal_states->size; ++i) { if (signal_states->states[i].pos >= signal_finals[signal_states->states[i].idx]) @@ -475,8 +479,6 @@ edje_match_callback_exec_check_finals(const Edje_Patterns *singal_ppat, if (signal_states->states[i].idx == source_states->states[j].idx && source_states->states[j].pos >= source_finals[source_states->states[j].idx]) { - Edje_Signal_Callback *escb; - escb = eina_list_nth(callbacks, signal_states->states[i].idx); if (escb) { @@ -484,19 +486,25 @@ edje_match_callback_exec_check_finals(const Edje_Patterns *singal_ppat, if ((!escb->just_added) && (!escb->delete_me)) { - escb->func(escb->data, ed->obj, sig, source); + eina_array_push(&run, escb); r = 2; } - if (_edje_block_break(ed)) - return 0; - if ((singal_ppat->delete_me) || (source_ppat->delete_me)) - return 0; } } } } } + while ((escb = eina_array_pop(&run))) + { + escb->func(escb->data, ed->obj, sig, source); + if (_edje_block_break(ed)) + return 0; + if ((signal_ppat->delete_me) || (source_ppat->delete_me)) + return 0; + } + eina_array_flush(&run); + return r; } |