X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=lib%2Fpool.c;h=8b7c372518b232f1f28cf2bda6b2d43bf5264067;hb=9f87c6fe6552ce8b2236a07307d2f825b0e4c439;hp=8c352f0fa9f83081cbf92551fa09179a52375958;hpb=5ce5a465727aef69c6faf7ab17d20bf17c66f336;p=libucw.git diff --git a/lib/pool.c b/lib/pool.c index 8c352f0f..8b7c3725 100644 --- a/lib/pool.c +++ b/lib/pool.c @@ -1,14 +1,17 @@ /* * Sherlock Library -- Memory Pools (One-Time Allocation) * - * (c) 1997 Martin Mares, + * (c) 1997--2001 Martin Mares + * + * This software may be freely distributed and used according to the terms + * of the GNU Lesser General Public License. */ -#include -#include +#include "lib/lib.h" +#include "lib/pools.h" -#include "lib.h" -#include "pools.h" +#include +#include struct memchunk { struct memchunk *next; @@ -16,7 +19,7 @@ struct memchunk { }; struct mempool * -new_pool(uns size) +mp_new(uns size) { struct mempool *p = xmalloc(sizeof(struct mempool)); @@ -30,25 +33,25 @@ new_pool(uns size) } void -free_pool(struct mempool *p) +mp_delete(struct mempool *p) { struct memchunk *c, *d; for(d=p->first; d; d = c) { c = d->next; - free(d); + xfree(d); } for(d=p->first_large; d; d = c) { c = d->next; - free(d); + xfree(d); } - free(p); + xfree(p); } void -flush_pool(struct mempool *p) +mp_flush(struct mempool *p) { struct memchunk *c; @@ -57,12 +60,12 @@ flush_pool(struct mempool *p) while (c = p->first_large) { p->first_large = c->next; - free(c); + xfree(c); } } void * -pool_alloc(struct mempool *p, uns s) +mp_alloc(struct mempool *p, uns s) { if (s <= p->threshold) { @@ -71,9 +74,12 @@ pool_alloc(struct mempool *p, uns s) { struct memchunk *c; - if (p->current && p->current->next) - /* Still have free chunks from previous incarnation */ - c = p->current->next; + if (p->current) + { + /* Still have free chunks from previous incarnation */ + c = p->current; + p->current = c->next; + } else { c = xmalloc(sizeof(struct memchunk) + p->chunk_size); @@ -81,7 +87,6 @@ pool_alloc(struct mempool *p, uns s) p->plast = &c->next; c->next = NULL; } - p->current = c; x = c->data; p->last = x + p->chunk_size; } @@ -96,3 +101,11 @@ pool_alloc(struct mempool *p, uns s) return c->data; } } + +void * +mp_alloc_zero(struct mempool *p, uns s) +{ + void *x = mp_alloc(p, s); + bzero(x, s); + return x; +}