jpeg pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=5284b62e930f0bef0ed3125b3a485e0599451ef8
commit 5284b62e930f0bef0ed3125b3a485e0599451ef8 Author: Jean-Philippe Andre <jp.an...@samsung.com> Date: Wed Apr 6 14:02:05 2016 +0900 Eo: Fix function cache after eo reinit The function call resolve cache may be broken after an eo shutdown + init cycle, leading to calls to invalid functions. This adds an static uint for each and every single EO API entry point, as well as an extra if() check. Now I'm not sure if the previous commit 0862b9d08384bc1d8 is still necessary. --- src/lib/eo/Eo.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/lib/eo/Eo.h b/src/lib/eo/Eo.h index fa31fb1..f890b83 100644 --- a/src/lib/eo/Eo.h +++ b/src/lib/eo/Eo.h @@ -488,6 +488,7 @@ typedef struct _Eo_Call_Cache # endif #endif Eo_Op op; + unsigned int generation; } Eo_Call_Cache; // to pass the internal function call to EO_FUNC_BODY (as Func parameter) @@ -503,10 +504,12 @@ typedef struct _Eo_Call_Cache #define EO_FUNC_COMMON_OP(Obj, Name, DefRet) \ static Eo_Call_Cache ___cache; /* static 0 by default */ \ Eo_Op_Call_Data ___call; \ - if (EINA_UNLIKELY(___cache.op == EO_NOOP)) \ + if (EINA_UNLIKELY((___cache.op == EO_NOOP) || \ + (___cache.generation != _eo_init_generation))) \ { \ ___cache.op = _eo_api_op_id_get(EO_FUNC_COMMON_OP_FUNC(Name)); \ if (___cache.op == EO_NOOP) return DefRet; \ + ___cache.generation = _eo_init_generation; \ } \ if (!_eo_call_resolve((Eo *) Obj, #Name, &___call, &___cache, \ __FILE__, __LINE__)) return DefRet; \ --