ev_set_allocator()
函数声明:
EV_API_DECL void ev_set_allocator (void *(*cb)(void *ptr, long size) EV_THROW) EV_THROW;
通过注释可以知道这是一个用来 分配和释放内存 的函数。 并且强调指出,与realloc类似,而不是malloc,至于realloc和malloc的区别移步笔者另一篇文章。 realloc最重要的地方就是它能根据已有的内存地址进行缩减或者扩充。
它的参数比较特别,是一个函数指针: void *(*cb)(void *ptr, long size) EV_THROW
函数定义:
ecb_cold
void
ev_set_allocator (void *(*cb)(void *ptr, long size) EV_THROW) EV_THROW
{
alloc = cb;
}
alloc:
static void *(*alloc)(void *ptr, long size) EV_THROW = ev_realloc_emul;
ev_realloc_emul:
static void *
ev_realloc_emul (void *ptr, long size) EV_THROW
{
if (size)
return realloc (ptr, size);
free (ptr);
return 0;
}
那么这个函数到底是不是用来申请内存的呢?其实从函数原型就看出来了,这个函数并不是用来申请内存的,还是用来给函数指针赋值的。
其实这只是一个工具函数,用于修改realloc 函数,以适应不同的操作系统,它并不用来申请内存,后续我们将遇到负责申请内存的函数。 提前告诉你,那个函数是 ev_realloc()
ev_set_allocator(realloc);
改变的并不是系统函数,而是libev里面负责内存申请的那个函数。
ev_set_syserr_cb()
函数声明:
EV_API_DECL void ev_set_syserr_cb (void (*cb)(const char *msg) EV_THROW) EV_THROW;
通过注释可以理解它是用来设置系统错误的回调,关于系统错误的回调,程序在发生错误的时候,会发送一些值给操作系统,比如perror,exit,abort等,只不过我们平时不深入系统,不必理会这些值。
函数定义:
ecb_cold
void
ev_set_syserr_cb (void (*cb)(const char *msg) EV_THROW) EV_THROW
{
syserr_cb = cb;
}
static void (*syserr_cb)(const char *msg) EV_THROW;
这个函数也是对系统的错误回调函数进行了封装。 封装的结果就是libev库将拥有自己的错误回调机制。 和上面申请内存封装函数一样,ev_set_syserr_cb()本身不负责错误回调,真正负责错误回调的函数是:ev_syserr()
|