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<