summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCedric BAIL <cedric@osg.samsung.com>2017-08-15 13:46:34 -0700
committerCedric BAIL <cedric@osg.samsung.com>2017-08-15 13:46:34 -0700
commitb5cede94ea57ff258a90a827848b01de25a7d557 (patch)
tree4c4a60082cd52a2c8bbf5ac58e107d0bec558570
parent45bcc87e76650290f7e216f2cc103985558bf7ee (diff)
downloadefl-b5cede94ea57ff258a90a827848b01de25a7d557.tar.gz
eina: add an API to check if a pointer is a valid element of a mempool.
-rw-r--r--src/lib/eina/eina_inline_mempool.x12
-rw-r--r--src/lib/eina/eina_mempool.c7
-rw-r--r--src/lib/eina/eina_mempool.h13
3 files changed, 28 insertions, 4 deletions
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.
@@ -179,6 +179,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.
*
* @param[in] mp The mempool