⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mem_dbg.c

📁 mediastreamer2是开源的网络传输媒体流的库
💻 C
📖 第 1 页 / 共 2 页
字号:
	{	int ret=0;	if (is_MemCheck_on()) /* _must_ be true */		{		MemCheck_off(); /* obtain MALLOC2 lock */		while(pop_info() != NULL)			ret++;		MemCheck_on(); /* release MALLOC2 lock */		}	return(ret);	}static unsigned long break_order_num=0;void CRYPTO_dbg_malloc(void *addr, int num, const char *file, int line,	int before_p)	{	MEM *m,*mm;	APP_INFO tmp,*amim;	switch(before_p & 127)		{	case 0:		break;	case 1:		if (addr == NULL)			break;		if (is_MemCheck_on())			{			MemCheck_off(); /* make sure we hold MALLOC2 lock */			if ((m=(MEM *)OPENSSL_malloc(sizeof(MEM))) == NULL)				{				OPENSSL_free(addr);				MemCheck_on(); /* release MALLOC2 lock				                * if num_disabled drops to 0 */				return;				}			if (mh == NULL)				{				if ((mh=lh_new(mem_hash, mem_cmp)) == NULL)					{					OPENSSL_free(addr);					OPENSSL_free(m);					addr=NULL;					goto err;					}				}			m->addr=addr;			m->file=file;			m->line=line;			m->num=num;			if (options & V_CRYPTO_MDEBUG_THREAD)				m->thread=CRYPTO_thread_id();			else				m->thread=0;			if (order == break_order_num)				{				/* BREAK HERE */				m->order=order;				}			m->order=order++;#ifdef LEVITTE_DEBUG_MEM			fprintf(stderr, "LEVITTE_DEBUG_MEM: [%5d] %c 0x%p (%d)\n",				m->order,				(before_p & 128) ? '*' : '+',				m->addr, m->num);#endif			if (options & V_CRYPTO_MDEBUG_TIME)				m->time=time(NULL);			else				m->time=0;			tmp.thread=CRYPTO_thread_id();			m->app_info=NULL;			if (amih != NULL				&& (amim=(APP_INFO *)lh_retrieve(amih,(char *)&tmp)) != NULL)				{				m->app_info = amim;				amim->references++;				}			if ((mm=(MEM *)lh_insert(mh,(char *)m)) != NULL)				{				/* Not good, but don't sweat it */				if (mm->app_info != NULL)					{					mm->app_info->references--;					}				OPENSSL_free(mm);				}		err:			MemCheck_on(); /* release MALLOC2 lock			                * if num_disabled drops to 0 */			}		break;		}	return;	}void CRYPTO_dbg_free(void *addr, int before_p)	{	MEM m,*mp;	switch(before_p)		{	case 0:		if (addr == NULL)			break;		if (is_MemCheck_on() && (mh != NULL))			{			MemCheck_off(); /* make sure we hold MALLOC2 lock */			m.addr=addr;			mp=(MEM *)lh_delete(mh,(char *)&m);			if (mp != NULL)				{#ifdef LEVITTE_DEBUG_MEM			fprintf(stderr, "LEVITTE_DEBUG_MEM: [%5d] - 0x%p (%d)\n",				mp->order, mp->addr, mp->num);#endif				if (mp->app_info != NULL)					app_info_free(mp->app_info);				OPENSSL_free(mp);				}			MemCheck_on(); /* release MALLOC2 lock			                * if num_disabled drops to 0 */			}		break;	case 1:		break;		}	}void CRYPTO_dbg_realloc(void *addr1, void *addr2, int num,	const char *file, int line, int before_p)	{	MEM m,*mp;#ifdef LEVITTE_DEBUG_MEM	fprintf(stderr, "LEVITTE_DEBUG_MEM: --> CRYPTO_dbg_malloc(addr1 = %p, addr2 = %p, num = %d, file = \"%s\", line = %d, before_p = %d)\n",		addr1, addr2, num, file, line, before_p);#endif	switch(before_p)		{	case 0:		break;	case 1:		if (addr2 == NULL)			break;		if (addr1 == NULL)			{			CRYPTO_dbg_malloc(addr2, num, file, line, 128 | before_p);			break;			}		if (is_MemCheck_on())			{			MemCheck_off(); /* make sure we hold MALLOC2 lock */			m.addr=addr1;			mp=(MEM *)lh_delete(mh,(char *)&m);			if (mp != NULL)				{#ifdef LEVITTE_DEBUG_MEM				fprintf(stderr, "LEVITTE_DEBUG_MEM: [%5d] * 0x%p (%d) -> 0x%p (%d)\n",					mp->order,					mp->addr, mp->num,					addr2, num);#endif				mp->addr=addr2;				mp->num=num;				lh_insert(mh,(char *)mp);				}			MemCheck_on(); /* release MALLOC2 lock			                * if num_disabled drops to 0 */			}		break;		}	return;	}typedef struct mem_leak_st	{	BIO *bio;	int chunks;	long bytes;	} MEM_LEAK;static void print_leak(const MEM *m, MEM_LEAK *l)	{	char buf[1024];	char *bufp = buf;	APP_INFO *amip;	int ami_cnt;	struct tm *lcl = NULL;	unsigned long ti;#define BUF_REMAIN (sizeof buf - (size_t)(bufp - buf))	if(m->addr == (char *)l->bio)	    return;	if (options & V_CRYPTO_MDEBUG_TIME)		{		lcl = localtime(&m->time);			BIO_snprintf(bufp, BUF_REMAIN, "[%02d:%02d:%02d] ",			lcl->tm_hour,lcl->tm_min,lcl->tm_sec);		bufp += strlen(bufp);		}	BIO_snprintf(bufp, BUF_REMAIN, "%5lu file=%s, line=%d, ",		m->order,m->file,m->line);	bufp += strlen(bufp);	if (options & V_CRYPTO_MDEBUG_THREAD)		{		BIO_snprintf(bufp, BUF_REMAIN, "thread=%lu, ", m->thread);		bufp += strlen(bufp);		}	BIO_snprintf(bufp, BUF_REMAIN, "number=%d, address=%08lX\n",		m->num,(unsigned long)m->addr);	bufp += strlen(bufp);	BIO_puts(l->bio,buf);		l->chunks++;	l->bytes+=m->num;	amip=m->app_info;	ami_cnt=0;	if (!amip)		return;	ti=amip->thread;		do		{		int buf_len;		int info_len;		ami_cnt++;		memset(buf,'>',ami_cnt);		BIO_snprintf(buf + ami_cnt, sizeof buf - ami_cnt,			" thread=%lu, file=%s, line=%d, info=\"",			amip->thread, amip->file, amip->line);		buf_len=strlen(buf);		info_len=strlen(amip->info);		if (128 - buf_len - 3 < info_len)			{			memcpy(buf + buf_len, amip->info, 128 - buf_len - 3);			buf_len = 128 - 3;			}		else			{			BUF_strlcpy(buf + buf_len, amip->info,				    sizeof buf - buf_len);			buf_len = strlen(buf);			}		BIO_snprintf(buf + buf_len, sizeof buf - buf_len, "\"\n");				BIO_puts(l->bio,buf);		amip = amip->next;		}	while(amip && amip->thread == ti);		#ifdef LEVITTE_DEBUG_MEM	if (amip)		{		fprintf(stderr, "Thread switch detected in backtrace!!!!\n");		abort();		}#endif	}static IMPLEMENT_LHASH_DOALL_ARG_FN(print_leak, const MEM *, MEM_LEAK *)void CRYPTO_mem_leaks(BIO *b)	{	MEM_LEAK ml;	if (mh == NULL && amih == NULL)		return;	MemCheck_off(); /* obtain MALLOC2 lock */	ml.bio=b;	ml.bytes=0;	ml.chunks=0;	if (mh != NULL)		lh_doall_arg(mh, LHASH_DOALL_ARG_FN(print_leak),				(char *)&ml);	if (ml.chunks != 0)		{		BIO_printf(b,"%ld bytes leaked in %d chunks\n",			   ml.bytes,ml.chunks);		}	else		{		/* Make sure that, if we found no leaks, memory-leak debugging itself		 * does not introduce memory leaks (which might irritate		 * external debugging tools).		 * (When someone enables leak checking, but does not call		 * this function, we declare it to be their fault.)		 *		 * XXX    This should be in CRYPTO_mem_leaks_cb,		 * and CRYPTO_mem_leaks should be implemented by		 * using CRYPTO_mem_leaks_cb.		 * (Also their should be a variant of lh_doall_arg		 * that takes a function pointer instead of a void *;		 * this would obviate the ugly and illegal		 * void_fn_to_char kludge in CRYPTO_mem_leaks_cb.		 * Otherwise the code police will come and get us.)		 */		int old_mh_mode;		CRYPTO_w_lock(CRYPTO_LOCK_MALLOC);		/* avoid deadlock when lh_free() uses CRYPTO_dbg_free(),		 * which uses CRYPTO_is_mem_check_on */		old_mh_mode = mh_mode;		mh_mode = CRYPTO_MEM_CHECK_OFF;		if (mh != NULL)			{			lh_free(mh);			mh = NULL;			}		if (amih != NULL)			{			if (lh_num_items(amih) == 0) 				{				lh_free(amih);				amih = NULL;				}			}		mh_mode = old_mh_mode;		CRYPTO_w_unlock(CRYPTO_LOCK_MALLOC);		}	MemCheck_on(); /* release MALLOC2 lock */	}#ifndef OPENSSL_NO_FP_APIvoid CRYPTO_mem_leaks_fp(FILE *fp)	{	BIO *b;	if (mh == NULL) return;	/* Need to turn off memory checking when allocated BIOs ... especially	 * as we're creating them at a time when we're trying to check we've not	 * left anything un-free()'d!! */	MemCheck_off();	b = BIO_new(BIO_s_file());	MemCheck_on();	if(!b) return;	BIO_set_fp(b,fp,BIO_NOCLOSE);	CRYPTO_mem_leaks(b);	BIO_free(b);	}#endif/* FIXME: We really don't allow much to the callback.  For example, it has   no chance of reaching the info stack for the item it processes.  Should   it really be this way?  -- Richard Levitte *//* NB: The prototypes have been typedef'd to CRYPTO_MEM_LEAK_CB inside crypto.h * If this code is restructured, remove the callback type if it is no longer * needed. -- Geoff Thorpe */static void cb_leak(const MEM *m, CRYPTO_MEM_LEAK_CB **cb)	{	(**cb)(m->order,m->file,m->line,m->num,m->addr);	}static IMPLEMENT_LHASH_DOALL_ARG_FN(cb_leak, const MEM *, CRYPTO_MEM_LEAK_CB **)void CRYPTO_mem_leaks_cb(CRYPTO_MEM_LEAK_CB *cb)	{	if (mh == NULL) return;	CRYPTO_w_lock(CRYPTO_LOCK_MALLOC2);	lh_doall_arg(mh, LHASH_DOALL_ARG_FN(cb_leak), &cb);	CRYPTO_w_unlock(CRYPTO_LOCK_MALLOC2);	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -