勿在浮沙筑高台
阅读流程
主要是参考 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函数。