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 0862b9d083 is
still necessary.
This commit is contained in:
Jean-Philippe Andre 2016-04-06 14:02:05 +09:00
parent 7eaf7af1d1
commit 5284b62e93
1 changed files with 4 additions and 1 deletions

View File

@ -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; \