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

-- 


Reply via email to