add hooks for malloc/free to mpool, add (no-op) purge function

We will need this to hook the resourcecollector in
This commit is contained in:
Christian Thaeter 2010-02-07 20:53:51 +01:00
parent b60d8aa907
commit 9feb01e4fe
2 changed files with 33 additions and 3 deletions

View file

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

View file

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