diff --git a/src/lib/eina/eina_inline_mempool.x b/src/lib/eina/eina_inline_mempool.x index f8afda8c83..d30364f097 100644 --- a/src/lib/eina/eina_inline_mempool.x +++ b/src/lib/eina/eina_inline_mempool.x @@ -52,6 +52,10 @@ struct _Eina_Mempool_Backend * available in the backend. * @see Eina_Mempool_Repack_Cb */ void (*repack)(void *data, Eina_Mempool_Repack_Cb cb, void *cb_data); + /** Function to check is a valid element from a mempool. + * @see eina_mempool_from + */ + Eina_Bool (*from)(void *data, void *element); }; struct _Eina_Mempool_Backend_ABI1 @@ -69,6 +73,7 @@ struct _Eina_Mempool_Backend_ABI1 struct _Eina_Mempool_Backend_ABI2 { void (*repack)(void *data, Eina_Mempool_Repack_Cb cb, void *cb_data); + Eina_Bool (*from)(void *data, void *element); }; struct _Eina_Mempool @@ -104,6 +109,13 @@ eina_mempool_free(Eina_Mempool *mp, void *element) if (element) mp->backend.free(mp->backend_data, element); } +static inline Eina_Bool +eina_mempool_from(Eina_Mempool *mp, void *element) +{ + if (!element) return EINA_FALSE; + return mp->backend2->from(mp->backend_data, element); +} + static inline unsigned int eina_mempool_alignof(unsigned int size) { diff --git a/src/lib/eina/eina_mempool.c b/src/lib/eina/eina_mempool.c index 536e6c822b..b72dadbce6 100644 --- a/src/lib/eina/eina_mempool.c +++ b/src/lib/eina/eina_mempool.c @@ -91,11 +91,12 @@ _new_va(const char *name, SBP(shutdown); #undef SBP - if (be->repack) + if (be->repack || be->from) { mp->backend2 = calloc(1, sizeof (Eina_Mempool_Backend_ABI2)); - if (mp->backend2) - mp->backend2->repack = be->repack; + if (!mp->backend2) goto on_error; + mp->backend2->repack = be->repack; + mp->backend2->from = be->from; } mp->backend_data = mp->backend.init(context, options, args); diff --git a/src/lib/eina/eina_mempool.h b/src/lib/eina/eina_mempool.h index bcf3b49384..606ecbaef9 100644 --- a/src/lib/eina/eina_mempool.h +++ b/src/lib/eina/eina_mempool.h @@ -169,7 +169,7 @@ static inline void eina_mempool_free(Eina_Mempool *mp, void *element) EINA_ARG_ * @see Eina_Mempool_Repack_Cb * @see _Eina_Mempool_Backend */ -EAPI void eina_mempool_repack(Eina_Mempool *mp, Eina_Mempool_Repack_Cb cb, void *data) EINA_ARG_NONNULL(1, 2); +EAPI void eina_mempool_repack(Eina_Mempool *mp, Eina_Mempool_Repack_Cb cb, void *data) EINA_ARG_NONNULL(1, 2); /** * @brief Runs a garbage collection cycle. @@ -178,6 +178,17 @@ EAPI void eina_mempool_repack(Eina_Mempool *mp, Eina_Mempool_Repack_Cb c */ EAPI void eina_mempool_gc(Eina_Mempool *mp) EINA_ARG_NONNULL(1); +/** + * @brief Check if a pointer is a valid element from the mempool + * + * @param[in] mp The mempool + * @param[in] element The data to free + * @return #EINA_TRUE if the element is a valid element of the mempool, #EINA_FALSE otherwise + * + * @since 1.20 + */ +static inline Eina_Bool eina_mempool_from(Eina_Mempool *mp, void *element); + /** * @brief Has the backend update its internal statistics. *