[sr-dev] git:master: core: mem - use mem_safety for f_malloc when DBG_F_MALLOC defined

Daniel-Constantin Mierla miconda at gmail.com
Fri Mar 30 09:31:46 CEST 2012


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

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date:   Fri Mar 30 09:29:18 2012 +0200

core: mem - use mem_safety for f_malloc when DBG_F_MALLOC defined

- added helper function to join a fragment with the next one when both
  are free, controlled by define MEM_JOIN_FREE and mem_join parameter

---

 mem/f_malloc.c |   55 ++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 52 insertions(+), 3 deletions(-)

diff --git a/mem/f_malloc.c b/mem/f_malloc.c
index 7beb3e2..4888b6e 100644
--- a/mem/f_malloc.c
+++ b/mem/f_malloc.c
@@ -445,6 +445,49 @@ found:
 }
 
 
+#ifdef MEM_JOIN_FREE
+/**
+ * join fragment f with next one (if it is free)
+ */
+static void fm_join_frag(struct fm_block* qm, struct fm_frag* f)
+{
+	int hash;
+	struct fm_frag **pf;
+	struct fm_frag* n;
+
+	n=FRAG_NEXT(f);
+	/* check if valid and if in free list */
+	if (((char*)n >= (char*)qm->last_frag) || (n->u.nxt_free==NULL))
+		return;
+
+	/* detach n from the free list */
+	hash=GET_HASH(n->size);
+	pf=&(qm->free_hash[hash].first);
+	/* find it */
+	for(;(*pf)&&(*pf!=n); pf=&((*pf)->u.nxt_free)); /*FIXME slow */
+	if (*pf==0){
+		/* not found, bad! */
+		LM_WARN("could not find %p in free list (hash=%ld)\n", n, GET_HASH(n->size));
+		return;
+	}
+	/* detach */
+	*pf=n->u.nxt_free;
+	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 */
+	f->size+=n->size+FRAG_OVERHEAD;
+#if defined(DBG_F_MALLOC) || defined(MALLOC_STATS)
+	qm->real_used-=FRAG_OVERHEAD;
+#ifdef MALLOC_STATS
+	sr_event_exec(SREV_PKG_SET_REAL_USED, (void*)qm->real_used);
+#endif /* MALLOC_STATS */
+#endif /* DBG_F_MALLOC || MALLOC_STATS*/
+}
+#endif /*MEM_JOIN_FREE*/
+
 /**
  * \brief Main memory manager free function
  * 
@@ -465,9 +508,11 @@ void fm_free(struct fm_block* qm, void* p)
 #ifdef DBG_F_MALLOC
 	MDBG("fm_free(%p, %p), called from %s: %s(%d)\n", qm, p, file, func, line);
 	if (p>(void*)qm->last_frag || p<(void*)qm->first_frag){
-		LOG(L_CRIT, "BUG: fm_free: bad pointer %p (out of memory block!) - "
-				"aborting\n", p);
-		abort();
+		LOG(L_CRIT, "BUG: fm_free: bad pointer %p (out of memory block!),"
+				" called from %s: %s(%d) - aborting\n", p,
+				file, func, line);
+		if(likely(cfg_get(core, core_cfg, mem_safety)==0))
+			abort();
 	}
 #endif
 	if (p==0) {
@@ -493,6 +538,10 @@ void fm_free(struct fm_block* qm, void* p)
 	f->func=func;
 	f->line=line;
 #endif
+#ifdef MEM_JOIN_FREE
+	if(unlikely(cfg_get(core, core_cfg, mem_join)!=0))
+		fm_join_frag(qm, f);
+#endif /*MEM_JOIN_FREE*/
 	fm_insert_free(qm, f);
 }
 




More information about the sr-dev mailing list