From d482c5cc59f9b572ec37c8e68434a12e50479c00 Mon Sep 17 00:00:00 2001 From: Cedric Bail Date: Sun, 17 Mar 2013 13:00:20 +0900 Subject: [PATCH] edje: fix run on 64bits system. --- src/lib/edje/edje_match.c | 12 ++++-------- src/lib/edje/edje_private.h | 4 ++-- src/lib/edje/edje_program.c | 24 +++++++++++++----------- src/lib/edje/edje_signal.c | 24 ++++++++++++++++++++++++ 4 files changed, 43 insertions(+), 21 deletions(-) diff --git a/src/lib/edje/edje_match.c b/src/lib/edje/edje_match.c index 5d66b618ac..5db023c761 100644 --- a/src/lib/edje/edje_match.c +++ b/src/lib/edje/edje_match.c @@ -509,8 +509,6 @@ edje_match_programs_exec_check_finals(const unsigned int *signal_finals, static int edje_match_callback_exec_check_finals(const Edje_Signals_Sources_Patterns *ssp, const Edje_Signal_Callback_Match *matches, - const void **custom_data, - const Eina_Bool *flags, const Edje_States *signal_states, const Edje_States *source_states, const char *sig, @@ -541,7 +539,7 @@ edje_match_callback_exec_check_finals(const Edje_Signals_Sources_Patterns *ssp, cb = &matches[*e]; if (cb) { - if ((prop) && _edje_signal_callback_prop(flags, *e)) continue; + if ((prop) && _edje_signal_callback_prop(ed->callbacks->flags, *e)) continue; eina_array_push(&run, cb); r = 2; } @@ -553,7 +551,9 @@ edje_match_callback_exec_check_finals(const Edje_Signals_Sources_Patterns *ssp, { int idx = cb - matches; - cb->func((void*) custom_data[idx], ed->obj, sig, source); + if (_edje_signal_callback_run(ed->callbacks->flags, idx)) continue; + + cb->func((void*) ed->callbacks->custom_data[idx], ed->obj, sig, source); if (_edje_block_break(ed)) { r = 0; @@ -684,8 +684,6 @@ edje_match_programs_exec(const Edje_Patterns *ppat_signal, int edje_match_callback_exec(const Edje_Signals_Sources_Patterns *ssp, const Edje_Signal_Callback_Match *matches, - const void **custom_data, - const Eina_Bool *flags, const char *sig, const char *source, Edje *ed, @@ -713,8 +711,6 @@ edje_match_callback_exec(const Edje_Signals_Sources_Patterns *ssp, if (signal_result && source_result) r = edje_match_callback_exec_check_finals(ssp, matches, - custom_data, - flags, signal_result, source_result, sig, diff --git a/src/lib/edje/edje_private.h b/src/lib/edje/edje_private.h index c6bd236019..376cb1b709 100644 --- a/src/lib/edje/edje_private.h +++ b/src/lib/edje/edje_private.h @@ -1836,8 +1836,6 @@ Eina_Bool edje_match_programs_exec(const Edje_Patterns *ppat_signal, Eina_Bool prop); int edje_match_callback_exec(const Edje_Signals_Sources_Patterns *ssp, const Edje_Signal_Callback_Match *matches, - const void **custom_data, - const Eina_Bool *flags, const char *sig, const char *source, Edje *ed, @@ -1967,6 +1965,8 @@ void _edje_signals_sources_patterns_clean(Edje_Signals_Sources_Patterns *ssp); const Edje_Signals_Sources_Patterns *_edje_signal_callback_patterns_ref(const Edje_Signal_Callback_Group *gp); void _edje_signal_callback_patterns_unref(const Edje_Signals_Sources_Patterns *essp); Eina_Bool _edje_signal_callback_prop(const Eina_Bool *flags, int i); +Eina_Bool _edje_signal_callback_run(const Eina_Bool *flags, unsigned int i); +void _edje_signal_callback_reset(Eina_Bool *flags, unsigned int length); void _edje_signal_callback_free(const Edje_Signal_Callback_Group *gp); diff --git a/src/lib/edje/edje_program.c b/src/lib/edje/edje_program.c index 2eb36306d0..b916d7613e 100644 --- a/src/lib/edje/edje_program.c +++ b/src/lib/edje/edje_program.c @@ -1408,8 +1408,6 @@ _edje_emit_cb(Edje *ed, const char *sig, const char *src, Edje_Message_Signal_Da { const Edje_Signals_Sources_Patterns *ssp; Edje_Signal_Callback_Matches *m; - const void **custom_data; - Eina_Bool *flags; const Eina_Inarray *match; int r = 1; @@ -1420,22 +1418,18 @@ _edje_emit_cb(Edje *ed, const char *sig, const char *src, Edje_Message_Signal_Da _edje_freeze(ed); _edje_block(ed); + ed->walking_callbacks++; + ssp = _edje_signal_callback_patterns_ref(ed->callbacks); m = (Edje_Signal_Callback_Matches*) ed->callbacks->matches; EINA_REFCOUNT_REF(m); callback_extra_data = (data) ? data->data : NULL; - custom_data = alloca(sizeof (void*) * m->matches_count); - memcpy(custom_data, ed->callbacks->custom_data, sizeof (void*) * m->matches_count); - flags = alloca(sizeof (Eina_Bool) * m->matches_count); - memcpy(flags, ed->callbacks->flags, sizeof (Eina_Bool) * (m->matches_count >> 1)); if (eina_inarray_count(&ssp->u.callbacks.globing)) r = edje_match_callback_exec(ssp, m->matches, - custom_data, - flags, sig, src, ed, @@ -1453,11 +1447,13 @@ _edje_emit_cb(Edje *ed, const char *sig, const char *src, Edje_Message_Signal_Da EINA_INARRAY_FOREACH(match, i) { + if (_edje_signal_callback_run(ed->callbacks->flags, *i)) continue; + if ((prop) && (_edje_signal_callback_prop(ed->callbacks->flags, + *i))) continue; + cb = &m->matches[*i]; - if ((prop) && (_edje_signal_callback_prop(flags, *i))) continue; - - cb->func((void*) custom_data[*i], ed->obj, sig, src); + cb->func((void*) ed->callbacks->custom_data[*i], ed->obj, sig, src); if (_edje_block_break(ed)) break; } @@ -1468,6 +1464,12 @@ _edje_emit_cb(Edje *ed, const char *sig, const char *src, Edje_Message_Signal_Da _edje_signal_callback_patterns_unref(ssp); + ed->walking_callbacks--; + + if (ed->walking_callbacks == 0) + _edje_signal_callback_reset(ed->callbacks->flags, + ed->callbacks->matches->matches_count); + _edje_unblock(ed); _edje_thaw(ed); _edje_unref(ed); diff --git a/src/lib/edje/edje_signal.c b/src/lib/edje/edje_signal.c index 3dfdae1230..8bf5645cf0 100644 --- a/src/lib/edje/edje_signal.c +++ b/src/lib/edje/edje_signal.c @@ -475,3 +475,27 @@ _edje_signal_callback_patterns_unref(const Edje_Signals_Sources_Patterns *essp) free(ssp); } } + +Eina_Bool +_edje_signal_callback_run(const Eina_Bool *flags, unsigned int i) +{ + Eina_Bool r; + + r = flags[i >> 1] & ((_DELETE_ME | _JUST_ADDED) << ((i & 0x1) * 4)); + + return r; +} + +void +_edje_signal_callback_reset(Eina_Bool *flags, unsigned int length) +{ + Eina_Bool mask; + unsigned int i; + + mask = ~((_JUST_ADDED << 4) | _JUST_ADDED); + + length >>= 1; + for (i = 0; i < length; ++i) + flags[i] &= mask; +} +