eina: add an API to check if a pointer is a valid element of a mempool.

This commit is contained in:
Cedric BAIL 2017-08-15 13:46:34 -07:00
parent 45bcc87e76
commit b5cede94ea
3 changed files with 28 additions and 4 deletions

View File

@ -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)
{

View File

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

View File

@ -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.
*