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

Klaus Darilion klaus.mailinglists at pernau.at
Fri Mar 30 10:05:11 CEST 2012


Hi Daniel!

It would be cool if can make an article on the wiki describing shortly 
which memory managers (difference) should be used when building Kamailio 
from source (e.g. for production usage, testing systems, memory 
debugging), and which is used in pre-built binaries. And of course how 
to use this new features.

Thanks
Klaus

On 30.03.2012 09:31, Daniel-Constantin Mierla wrote:
> 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);
>   }
>
>
>
> _______________________________________________
> sr-dev mailing list
> sr-dev at lists.sip-router.org
> http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev



More information about the sr-dev mailing list