Module: sip-router
Branch: master
Commit: 2b2569ea4e4d2af817e8e021408d551a99572f59
URL:    
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=2b2569ea4e4d2af817e8e021408d551a99572f59

Author: Daniel-Constantin Mierla <[email protected]>
Committer: Daniel-Constantin Mierla <[email protected]>
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){


_______________________________________________
sr-dev mailing list
[email protected]
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to