Module: sip-router
Branch: master
Commit: 1124b8cb29b942172c4aab38119f4a3c5f6e45f3
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=1124b8c…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Committer: Daniel-Constantin Mierla <miconda(a)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);
}