From 29a1a6a7a06d5ca466e9ecfef758df2b8af95254 Mon Sep 17 00:00:00 2001 From: Christian Thaeter Date: Thu, 14 May 2009 19:56:33 +0200 Subject: [PATCH] mpool: some pending cosmetics an trace points --- src/lib/mpool.c | 61 ++++++++++++++++++++++++------------------------- 1 file changed, 30 insertions(+), 31 deletions(-) diff --git a/src/lib/mpool.c b/src/lib/mpool.c index 0810efacc..b79dc59b0 100644 --- a/src/lib/mpool.c +++ b/src/lib/mpool.c @@ -139,7 +139,6 @@ mpool_destroy (MPool self) - MPool mpool_cluster_alloc_ (MPool self) { @@ -165,7 +164,6 @@ mpool_cluster_alloc_ (MPool self) /* we insert the cluster at head because its likely be used next */ llist_insert_head (&self->clusters, llist_init (&cluster->node)); - self->elements_free += self->elements_per_cluster; return self; @@ -188,6 +186,7 @@ cmp_cluster_contains_element (const_LList cluster, const_LList element, void* se return 0; } + static inline MPoolcluster element_cluster_get (MPool self, void* element) { @@ -218,26 +217,26 @@ uintptr_nearestbit (uintptr_t v, unsigned n) } - static inline void* alloc_near (MPoolcluster cluster, MPool self, void* locality) { + TRACE (mpool_dbg, "locality %p", locality); void* begin_of_elements = (void*)cluster + sizeof (*cluster) + /* header */ MPOOL_BITMAP_SIZE (((MPool)self)->elements_per_cluster); /* bitmap */ + uintptr_t index = (locality - begin_of_elements) / self->elem_size; + #if UINTPTR_MAX > 4294967295U /* 64 bit */ - lldiv_t div = lldiv((locality - begin_of_elements) / self->elem_size, sizeof(uintptr_t)*CHAR_BIT); + lldiv_t div = lldiv(index, sizeof(uintptr_t)*CHAR_BIT); #else /* 32 bit */ - ldiv_t div = ldiv((locality - begin_of_elements) / self->elem_size, sizeof(uintptr_t)*CHAR_BIT); + ldiv_t div = ldiv(index, sizeof(uintptr_t)*CHAR_BIT); #endif uintptr_t* bitmap = (uintptr_t*)&cluster->data; unsigned r = ~0U; - TRACE (mpool_dbg, "cluster %p: bitmap %p %p: elements %p: index %d", cluster, bitmap, bitmap[div.quot], begin_of_elements, div.quot); - /* the bitmap word at locality */ if (bitmap[div.quot] < UINTPTR_MAX) { @@ -250,7 +249,7 @@ alloc_near (MPoolcluster cluster, MPool self, void* locality) r = uintptr_nearestbit (~bitmap[div.quot], sizeof(uintptr_t)*CHAR_BIT-1); } - if (r != ~0U) + if (r != ~0U && (div.quot*sizeof(uintptr_t)*CHAR_BIT+r) < self->elements_per_cluster) { void* ret = begin_of_elements + ((uintptr_t)(div.quot*sizeof(uintptr_t)*CHAR_BIT+r)*self->elem_size); return ret; @@ -267,10 +266,12 @@ bitmap_set_element (MPoolcluster cluster, MPool self, void* element) sizeof (*cluster) + /* header */ MPOOL_BITMAP_SIZE (((MPool)self)->elements_per_cluster); /* bitmap */ + uintptr_t index = (element - begin_of_elements) / self->elem_size; + #if UINTPTR_MAX > 4294967295U /* 64 bit */ - lldiv_t div = lldiv((element - begin_of_elements) / self->elem_size, sizeof(uintptr_t)*CHAR_BIT); + lldiv_t div = lldiv(index, sizeof(uintptr_t)*CHAR_BIT); #else /* 32 bit */ - ldiv_t div = ldiv((element - begin_of_elements) / self->elem_size, sizeof(uintptr_t)*CHAR_BIT); + ldiv_t div = ldiv(index, sizeof(uintptr_t)*CHAR_BIT); #endif uintptr_t* bitmap = (uintptr_t*)&cluster->data; @@ -288,24 +289,26 @@ bitmap_clear_element (MPoolcluster cluster, MPool self, void* element) sizeof (*cluster) + /* header */ MPOOL_BITMAP_SIZE (((MPool)self)->elements_per_cluster); /* bitmap */ + uintptr_t index = (element - begin_of_elements) / self->elem_size; + #if UINTPTR_MAX > 4294967295U /* 64 bit */ - lldiv_t div = lldiv((element - begin_of_elements) / self->elem_size, sizeof(uintptr_t)*CHAR_BIT); + lldiv_t div = lldiv(index, sizeof(uintptr_t)*CHAR_BIT); #else /* 32 bit */ - ldiv_t div = ldiv((element - begin_of_elements) / self->elem_size, sizeof(uintptr_t)*CHAR_BIT); + ldiv_t div = ldiv(index, sizeof(uintptr_t)*CHAR_BIT); #endif uintptr_t* bitmap = (uintptr_t*)&cluster->data; bitmap[div.quot] &= ~((uintptr_t)1<elements_free) { if (mpool_cluster_alloc_ (self)) @@ -335,11 +338,10 @@ mpool_alloc (MPool self) if (ret) { - llist_unlink_fast_ ((LList)ret); bitmap_set_element (element_cluster_get (self, ret), self, ret); + llist_unlink_fast_ ((LList)ret); } - TRACE (mpool_dbg, "%p", ret); self->locality = ret; --self->elements_free; @@ -347,11 +349,6 @@ mpool_alloc (MPool self) } - - -/* - put a element back on the pool -*/ static inline MPoolnode find_near (MPoolcluster cluster, MPool self, void* element) { @@ -371,8 +368,6 @@ find_near (MPoolcluster cluster, MPool self, void* element) uintptr_t* bitmap = (uintptr_t*)&cluster->data; unsigned r = ~0U; - TRACE (mpool_dbg, "cluster %p: bitmap %p %p: elements %p: index %d", cluster, bitmap, bitmap[div.quot], begin_of_elements, div.quot); - /* the bitmap word at locality */ if (bitmap[div.quot] < UINTPTR_MAX) { @@ -391,12 +386,13 @@ find_near (MPoolcluster cluster, MPool self, void* element) r = uintptr_nearestbit (~bitmap[div.quot], sizeof(uintptr_t)*CHAR_BIT-1); } - if (r != ~0U) + if (r != ~0U && (div.quot*sizeof(uintptr_t)*CHAR_BIT+r) < self->elements_per_cluster) return begin_of_elements + ((uintptr_t)(div.quot*sizeof(uintptr_t)*CHAR_BIT+r)*self->elem_size); return NULL; } + void mpool_free (MPool self, void* element) { @@ -405,15 +401,14 @@ mpool_free (MPool self, void* element) TRACE (mpool_dbg, "mpool %p: element %p", self, element); MPoolcluster cluster = element_cluster_get (self,element); + MPoolnode near = find_near (cluster, self, element); bitmap_clear_element (cluster, self, element); llist_init (&((MPoolnode)element)->node); - MPoolnode near = find_near (cluster, self, element); - TRACE (mpool_dbg, "near %p", near); - if (near) { + TRACE (mpool_dbg, "found near %p", near); if (near < (MPoolnode)element) llist_insert_next (&near->node, &((MPoolnode)element)->node); else @@ -422,8 +417,6 @@ mpool_free (MPool self, void* element) else llist_insert_tail (&self->freelist, &((MPoolnode)element)->node); - bitmap_clear_element (cluster, self, element); - ++self->elements_free; } } @@ -448,7 +441,6 @@ mpool_reserve (MPool self, unsigned nelements) } - void nobug_mpool_dump (const_MPool self, const int depth, @@ -485,3 +477,10 @@ nobug_mpool_dump (const_MPool self, } +/* +// Local Variables: +// mode: C +// c-file-style: "gnu" +// indent-tabs-mode: nil +// End: +*/