diff options
author | Maria Matejka <mq@ucw.cz> | 2022-03-09 10:30:33 +0100 |
---|---|---|
committer | Maria Matejka <mq@ucw.cz> | 2022-03-09 10:30:42 +0100 |
commit | b90c9b164fedd44115c01fb2b07f71fb40ab3b77 (patch) | |
tree | 951883c940cd4ba5f3a9d1334f65b0d99cb2909f /lib/mempool.c | |
parent | eeec9ddbf2a3536417c6dd434da9a7dd2bbdaa42 (diff) |
Linpools with pages fixed to the final page allocator version
Diffstat (limited to 'lib/mempool.c')
-rw-r--r-- | lib/mempool.c | 33 |
1 files changed, 18 insertions, 15 deletions
diff --git a/lib/mempool.c b/lib/mempool.c index f9a9aaca..c75f1f5b 100644 --- a/lib/mempool.c +++ b/lib/mempool.c @@ -37,7 +37,6 @@ const int lp_chunk_size = sizeof(struct lp_chunk); struct linpool { resource r; byte *ptr, *end; - pool *p; struct lp_chunk *first, *current; /* Normal (reusable) chunks */ struct lp_chunk *first_large; /* Large chunks */ uint chunk_size, threshold, total:31, use_pages:1, total_large; @@ -72,7 +71,6 @@ linpool *lp_new(pool *p, uint blk) { linpool *m = ralloc(p, &lp_class); - m->p = p; if (!blk) { m->use_pages = 1; @@ -132,7 +130,7 @@ lp_alloc(linpool *m, uint size) { /* Need to allocate a new chunk */ if (m->use_pages) - c = alloc_page(m->p); + c = alloc_page(); else c = xmalloc(sizeof(struct lp_chunk) + m->chunk_size); @@ -273,7 +271,7 @@ lp_free(resource *r) { c = d->next; if (m->use_pages) - free_page(m->p, d); + free_page(d); else xfree(d); } @@ -308,19 +306,24 @@ static struct resmem lp_memsize(resource *r) { linpool *m = (linpool *) r; - struct lp_chunk *c; - int cnt = 0; + struct resmem sz = { + .overhead = sizeof(struct linpool) + ALLOC_OVERHEAD, + }; - for(c=m->first; c; c=c->next) - cnt++; - for(c=m->first_large; c; c=c->next) - cnt++; + for (struct lp_chunk *c = m->first_large; c; c = c->next) + { + sz.effective += c->size; + sz.overhead += lp_chunk_size + ALLOC_OVERHEAD; + } - return (struct resmem) { - .effective = m->total + m->total_large, - .overhead = ALLOC_OVERHEAD + sizeof(struct linpool) + - cnt * (ALLOC_OVERHEAD + sizeof(struct lp_chunk)), - }; + uint regular = 0; + for (struct lp_chunk *c = m->first; c; c = c->next) + regular++; + + sz.effective += m->chunk_size * regular; + sz.overhead += (lp_chunk_size + ALLOC_OVERHEAD) * regular; + + return sz; } |