[sr-dev] git:master: core/mem: f_malloc - simplified join in realloc

Daniel-Constantin Mierla miconda at gmail.com
Sat May 3 23:45:23 CEST 2014


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 <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at 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){




More information about the sr-dev mailing list