Linpools may use pages instead of xmalloc
This commit is contained in:
parent
bea582cbb5
commit
e5a8eec6d7
2 changed files with 19 additions and 4 deletions
|
@ -37,9 +37,10 @@ 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, total_large;
|
||||
uint chunk_size, threshold, total:31, use_pages:1, total_large;
|
||||
};
|
||||
|
||||
static void lp_free(resource *);
|
||||
|
@ -69,6 +70,13 @@ linpool
|
|||
*lp_new(pool *p, uint blk)
|
||||
{
|
||||
linpool *m = ralloc(p, &lp_class);
|
||||
m->p = p;
|
||||
if (!blk)
|
||||
{
|
||||
m->use_pages = 1;
|
||||
blk = page_size - lp_chunk_size;
|
||||
}
|
||||
|
||||
m->chunk_size = blk;
|
||||
m->threshold = 3*blk/4;
|
||||
return m;
|
||||
|
@ -121,7 +129,11 @@ lp_alloc(linpool *m, uint size)
|
|||
else
|
||||
{
|
||||
/* Need to allocate a new chunk */
|
||||
c = xmalloc(sizeof(struct lp_chunk) + m->chunk_size);
|
||||
if (m->use_pages)
|
||||
c = alloc_page(m->p);
|
||||
else
|
||||
c = xmalloc(sizeof(struct lp_chunk) + m->chunk_size);
|
||||
|
||||
m->total += m->chunk_size;
|
||||
c->next = NULL;
|
||||
c->size = m->chunk_size;
|
||||
|
@ -258,7 +270,10 @@ lp_free(resource *r)
|
|||
for(d=m->first; d; d = c)
|
||||
{
|
||||
c = d->next;
|
||||
xfree(d);
|
||||
if (m->use_pages)
|
||||
free_page(m->p, d);
|
||||
else
|
||||
xfree(d);
|
||||
}
|
||||
for(d=m->first_large; d; d = c)
|
||||
{
|
||||
|
|
|
@ -76,7 +76,7 @@ void lp_restore(linpool *m, lp_state *p); /* Restore state */
|
|||
extern const int lp_chunk_size;
|
||||
#define LP_GAS 1024
|
||||
#define LP_GOOD_SIZE(x) (((x + LP_GAS - 1) & (~(LP_GAS - 1))) - lp_chunk_size)
|
||||
#define lp_new_default(p) lp_new(p, LP_GOOD_SIZE(LP_GAS*4))
|
||||
#define lp_new_default(p) lp_new(p, 0)
|
||||
|
||||
/* Slabs */
|
||||
|
||||
|
|
Loading…
Reference in a new issue