From 9feb01e4fe37d6d02b2e9ef8ac2aeaf53c97649e Mon Sep 17 00:00:00 2001 From: Christian Thaeter Date: Sun, 7 Feb 2010 20:53:51 +0100 Subject: [PATCH] add hooks for malloc/free to mpool, add (no-op) purge function We will need this to hook the resourcecollector in --- src/lib/mpool.c | 22 +++++++++++++++++++--- src/lib/mpool.h | 14 ++++++++++++++ 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/lib/mpool.c b/src/lib/mpool.c index 8c1d88a93..dfacd012e 100644 --- a/src/lib/mpool.c +++ b/src/lib/mpool.c @@ -37,10 +37,15 @@ #define MPOOL_C(c) c ## UL #endif +/* + defaults for the hooks, used when creating mpools + */ +void *(*mpool_malloc_hook)(size_t size) = malloc; +void (*mpool_free_hook)(void *ptr) = free; + /* Cluster and node structures are private */ - typedef struct mpoolcluster_struct mpoolcluster; typedef mpoolcluster* MPoolcluster; typedef const mpoolcluster* const_MPoolcluster; @@ -94,6 +99,9 @@ mpool_init (MPool self, size_t elem_size, unsigned elements_per_cluster, mpool_d self->elements_free = 0; self->destroy = dtor; self->locality = NULL; + + self->malloc_hook = mpool_malloc_hook; + self->free_hook = mpool_free_hook; } return self; @@ -144,7 +152,7 @@ mpool_destroy (MPool self) llist_unlink_fast_ (cluster); TRACE (mpool_dbg, "freeing cluster %p" , cluster); - free (cluster); + self->free_hook (cluster); } llist_init (&self->freelist); @@ -156,11 +164,19 @@ mpool_destroy (MPool self) } +MPool +mpool_purge (MPool self) +{ + // not UNIMPLEMENTED because valid no-op + PLANNED("To be implemented"); + return self; +} + MPool mpool_cluster_alloc_ (MPool self) { - MPoolcluster cluster = malloc (self->cluster_size); + MPoolcluster cluster = self->malloc_hook (self->cluster_size); TRACE (mpool_dbg, "%p", cluster); if (!cluster) diff --git a/src/lib/mpool.h b/src/lib/mpool.h index aa9b66562..b66f27616 100644 --- a/src/lib/mpool.h +++ b/src/lib/mpool.h @@ -77,6 +77,8 @@ struct mpool_struct unsigned elements_free; /* a counter of free elements is the price we pay to support a reserve() operation */ void* locality; mpool_destroy_fn destroy; + void *(*malloc_hook)(size_t); + void (*free_hook)(void *); }; @@ -128,6 +130,18 @@ mpool_init (MPool self, size_t elem_size, unsigned elements_per_cluster, mpool_d MPool mpool_destroy (MPool self); +/* +//index.mpool_purge xref:mpool_purge[mpool_purge()]:: free unused clusters +//mpool [[mpool_purge]] +//mpool .mpool_purge +//mpool +//mpool TODO +//mpool +//mpool +*/ +MPool +mpool_purge (MPool self); + /* //index.mpool_available xref:mpool_available[mpool_available()]:: query number of free elements