diff --git a/legacy/eina/src/include/eina_inline_mempool.x b/legacy/eina/src/include/eina_inline_mempool.x index 72e70fe131..e9f20b550b 100644 --- a/legacy/eina/src/include/eina_inline_mempool.x +++ b/legacy/eina/src/include/eina_inline_mempool.x @@ -26,6 +26,9 @@ */ /* Memory Pool */ +typedef struct _Eina_Mempool_Backend_ABI1 Eina_Mempool_Backend_ABI1; +typedef struct _Eina_Mempool_Backend_ABI2 Eina_Mempool_Backend_ABI2; + struct _Eina_Mempool_Backend { const char *name; @@ -39,10 +42,28 @@ struct _Eina_Mempool_Backend void (*repack)(void *data, Eina_Mempool_Repack_Cb cb, void *cb_data); }; +struct _Eina_Mempool_Backend_ABI1 +{ + const char *name; + void *(*init)(const char *context, const char *options, va_list args); + void (*free)(void *data, void *element); + void *(*alloc)(void *data, unsigned int size); + void *(*realloc)(void *data, void *element, unsigned int size); + void (*garbage_collect)(void *data); + void (*statistics)(void *data); + void (*shutdown)(void *data); +}; + +struct _Eina_Mempool_Backend_ABI2 +{ + void (*repack)(void *data, Eina_Mempool_Repack_Cb cb, void *cb_data); +}; + struct _Eina_Mempool { - Eina_Mempool_Backend backend; + Eina_Mempool_Backend_ABI1 backend; void *backend_data; + Eina_Mempool_Backend_ABI2 backend2; }; /** diff --git a/legacy/eina/src/lib/eina_mempool.c b/legacy/eina/src/lib/eina_mempool.c index ddeabca6b4..32a6831651 100644 --- a/legacy/eina/src/lib/eina_mempool.c +++ b/legacy/eina/src/lib/eina_mempool.c @@ -80,8 +80,19 @@ _new_va(const char *name, if (!mp) goto on_error; - /* FIXME why backend is not a pointer? */ - mp->backend = *be; + /* Work around ABI incompability introduced in Eina 1.1 */ +#define SBP(Property) mp->backend.Property = be->Property; + SBP(name); + SBP(init); + SBP(free); + SBP(alloc); + SBP(realloc); + SBP(garbage_collect); + SBP(statistics); + SBP(shutdown); +#undef SBP + mp->backend2.repack = be->repack; + mp->backend_data = mp->backend.init(context, options, args); return mp; @@ -324,7 +335,7 @@ EAPI void eina_mempool_repack(Eina_Mempool *mp, Eina_Mempool_Repack_Cb cb, void EINA_SAFETY_ON_NULL_RETURN(mp); EINA_SAFETY_ON_NULL_RETURN(mp->backend.shutdown); DBG("mp=%p", mp); - mp->backend.repack(mp->backend_data, cb, data); + mp->backend2.repack(mp->backend_data, cb, data); } EAPI void eina_mempool_gc(Eina_Mempool *mp)