From 5284b62e930f0bef0ed3125b3a485e0599451ef8 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Andre Date: Wed, 6 Apr 2016 14:02:05 +0900 Subject: [PATCH] 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 fa31fb1f85..f890b839f9 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; \