diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-02-06 22:47:05 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-02-06 22:47:05 +0100 |
commit | e836796365fdcd389aaa0fd7deed34e4f21e7334 (patch) | |
tree | f009bc7837e91b09b6e8fa39abce1b8d957d75a8 /sys/src/libc/port | |
parent | c065eadb535347661079b93ef4b77739ec40a064 (diff) |
pool: use uintptr for pool size
note, arenas and blocks still use ulong for sizes. so
we have to check for overflow when attempting to merge
arenas.
Diffstat (limited to 'sys/src/libc/port')
-rw-r--r-- | sys/src/libc/port/pool.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/sys/src/libc/port/pool.c b/sys/src/libc/port/pool.c index 1f9b26a64..468607828 100644 --- a/sys/src/libc/port/pool.c +++ b/sys/src/libc/port/pool.c @@ -555,8 +555,8 @@ poolnewarena(Pool *p, ulong asize) LOG(p, "newarena %lud\n", asize); if(p->cursize+asize > p->maxsize) { if(poolcompactl(p) == 0){ - LOG(p, "pool too big: %lud+%lud > %lud\n", - p->cursize, asize, p->maxsize); + LOG(p, "pool too big: %llud+%lud > %llud\n", + (uvlong)p->cursize, asize, (uvlong)p->maxsize); werrstr("memory pool too large"); } return; @@ -637,12 +637,14 @@ arenamerge(Pool *p, Arena *bot, Arena *top) { Bhdr *bbot, *btop; Btail *t; + ulong newsize; blockcheck(p, bot); blockcheck(p, top); assert(bot->aup == top && top > bot); - if(p->merge == nil || p->merge(bot, top) == 0) + newsize = top->asize + ((uchar*)top - (uchar*)bot); + if(newsize < top->asize || p->merge == nil || p->merge(bot, top) == 0) return nil; /* remove top from list */ @@ -659,7 +661,7 @@ arenamerge(Pool *p, Arena *bot, Arena *top) blockcheck(p, btop); /* grow bottom arena to encompass top */ - arenasetsize(bot, top->asize + ((uchar*)top - (uchar*)bot)); + arenasetsize(bot, newsize); /* grow bottom block to encompass space between arenas */ blockgrow(p, bbot, (uchar*)btop-(uchar*)bbot); |