Module: sip-router Branch: master Commit: 2b2569ea4e4d2af817e8e021408d551a99572f59 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=2b2569ea...
Author: Daniel-Constantin Mierla miconda@gmail.com Committer: Daniel-Constantin Mierla miconda@gmail.com Date: Sat May 3 23:44:22 2014 +0200
core/mem: f_malloc - simplified join in realloc
- restore proper usage counters
---
mem/f_malloc.c | 38 +++++++++----------------------------- 1 files changed, 9 insertions(+), 29 deletions(-)
diff --git a/mem/f_malloc.c b/mem/f_malloc.c index 4c3576a..053b589 100644 --- a/mem/f_malloc.c +++ b/mem/f_malloc.c @@ -72,7 +72,7 @@
#define FRAG_OVERHEAD (sizeof(struct fm_frag)) #define INIT_OVERHEAD \ - (ROUNDUP(sizeof(struct fm_block))+sizeof(struct fm_frag)) + (ROUNDUP(sizeof(struct fm_block))+2*sizeof(struct fm_frag))
@@ -287,9 +287,6 @@ void fm_split_frag(struct fm_block* qm, struct fm_frag* frag, n=FRAG_NEXT(frag); n->size=rest-FRAG_OVERHEAD; FRAG_CLEAR_USED(n); /* never used */ - /* new frag overhead */ - qm->real_used+=FRAG_OVERHEAD; - qm->used-=FRAG_OVERHEAD; #ifdef DBG_F_MALLOC /* frag created by malloc, mark it*/ n->file=file; @@ -298,6 +295,7 @@ void fm_split_frag(struct fm_block* qm, struct fm_frag* frag, n->check=ST_CHECK_PATTERN; #endif /* reinsert n in free list*/ + qm->used-=FRAG_OVERHEAD; fm_insert_free(qm, n); }else{ /* we cannot split this fragment any more => alloc all of it*/ @@ -393,8 +391,8 @@ struct fm_frag* fm_search_defrag(struct fm_block* qm, unsigned long size) fm_extract_free(qm, nxt); frag->size += nxt->size + FRAG_OVERHEAD;
- /* join - one frag less, remove overhead */ - qm->real_used -= FRAG_OVERHEAD; + /* join - one frag less, add overhead to used */ + qm->used += FRAG_OVERHEAD;
if( frag->size >size ) return frag; @@ -553,7 +551,8 @@ static void fm_join_frag(struct fm_block* qm, struct fm_frag* f) #endif /* F_MALLOC_HASH_BITMAP */ /* join */ f->size+=n->size+FRAG_OVERHEAD; - qm->real_used-=FRAG_OVERHEAD; + qm->real_used+=n->size; + qm->used+=n->size + FRAG_OVERHEAD; } #endif /*MEM_JOIN_FREE*/
@@ -633,12 +632,10 @@ void* fm_realloc(struct fm_block* qm, void* p, unsigned long size) #endif { struct fm_frag *f; - struct fm_frag **pf; unsigned long diff; unsigned long orig_size; struct fm_frag *n; void *ptr; - int hash; #ifdef DBG_F_MALLOC MDBG("fm_realloc(%p, %p, %lu) called from %s: %s(%d)\n", qm, p, size, @@ -688,28 +685,11 @@ void* fm_realloc(struct fm_block* qm, void* p, unsigned long size) n=FRAG_NEXT(f); if (((char*)n < (char*)qm->last_frag) && (n->prv_free) && ((n->size+FRAG_OVERHEAD)>=diff)){ - /* join */ /* detach n from the free list */ - hash=GET_HASH(n->size); - pf=n->prv_free; - if (*pf==0){ - /* not found, bad! */ - LOG(L_CRIT, "BUG: fm_realloc: could not find %p in free " - "list (hash=%ld)\n", n, GET_HASH(n->size)); - abort(); - } - /* detach */ - *pf=n->u.nxt_free; - if(n->u.nxt_free) n->u.nxt_free->prv_free = pf; - qm->ffrags--; - qm->free_hash[hash].no--; -#ifdef F_MALLOC_HASH_BITMAP - if (qm->free_hash[hash].no==0) - fm_bmp_reset(qm, hash); -#endif /* F_MALLOC_HASH_BITMAP */ - /* join */ + fm_extract_free(qm, n); + /* join */ f->size+=n->size+FRAG_OVERHEAD; - qm->real_used-=FRAG_OVERHEAD; + qm->used+=FRAG_OVERHEAD;
/* split it if necessary */ if (f->size > size){