libevent源码阅读2---内存管理

勿在浮沙筑高台

阅读流程
主要是参考 libevent的参考手册,根据其介绍的模块顺序去阅读源码
链接
http://www.cppblog.com/mysileng/archive/2013/02/04/197717.html

内存操作

void event_set_mem_functions(
	void *(*malloc_fn)(size_t sz),
	void *(*realloc_fn)(void *ptr, size_t sz),
	void (*free_fn)(void *ptr))
{
	_mm_malloc_fn = malloc_fn;//内存分配
	_mm_realloc_fn = realloc_fn;//内存重分配
	_mm_free_fn = free_fn;//内存释放
}#ifndef _EVENT_DISABLE_MM_REPLACEMENT
static void *(*_mm_malloc_fn)(size_t sz) = NULL;
static void *(*_mm_realloc_fn)(void *p, size_t sz) = NULL;
static void (*_mm_free_fn)(void *p) = NULL;
三个回调对象。

通过调用此函数,将我们自定义的内存操作函数作为参数设置进去可以替代libevent的默认内存操作槽函数.
内存具体操作函数:

void *
event_mm_malloc_(size_t sz)//申请内存
{
	if (_mm_malloc_fn)
		return _mm_malloc_fn(sz);
	else
		return malloc(sz);//可以看到libevent默认使用
		//malloc函数来分配内存
}
void *
event_mm_calloc_(size_t count, size_t size)
{
	if (_mm_malloc_fn) {
		size_t sz = count * size;
		void *p = _mm_malloc_fn(sz);
		if (p)
			memset(p, 0, sz);
		return p;
	} else
		return calloc(count, size);
}
void *
event_mm_realloc_(void *ptr, size_t sz)
{
//重新调整之前分配的内存
	if (_mm_realloc_fn)
		return _mm_realloc_fn(ptr, sz);
	else
		return realloc(ptr, sz);
}
void
event_mm_free_(void *ptr)
{
	if (_mm_free_fn)
		_mm_free_fn(ptr);
	else
		free(ptr);
}

通过以上代码可以看到,要是用户没有自定义内存操作函数,则libevent使用的都是C的系统函数来进行内存操作。
建议:在使用自定义的内存操作函数的时候,考虑一下多线程环境下的同步。以免发生错误

使用自定义内存操作函数注意点

替换内存管理函数影响libevent随后的所有分配、调整大小和释放内存操作。所以,必须保证在调用任何其他libevent函数之前进行替换。否则,libevent可能用你的free函数释放用C库的malloc分配的内存。
你的malloc和realloc函数返回的内存块应该具有和C库返回的内存块一样的地址对齐。
你的realloc函数应该正确处理realloc(NULL,sz)(也就是当作malloc(sz)处理)
你的realloc函数应该正确处理realloc(ptr,0)(也就是当作free(ptr)处理)
你的free函数不必处理free(NULL)
你的malloc函数不必处理malloc(0)
如果在多个线程中使用libevent,替代的内存管理函数需要是线程安全的。
libevent将使用这些函数分配返回给你的内存。所以,如果要释放由libevent函数分配和返回的内存,而你已经替换malloc和realloc函数,那么应该使用替代的free函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一路初心向前

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值