redis有可能运行在不同的平台,所以它为了不同平台的差异(1)进行了封定义平台之间的差异, 把其他平台的函数定义为标准C函数比如#define realloc(ptr,size) je_realloc(ptr,size) 把Facebook平台的realloc定义为我们常用的realloc。
void *zmalloc(size_t size); { //开空间函数
void *ptr = malloc( size + PREFIX_SIZE );//因为为了好管理,每次开辟内存都把内存大小存放在地址的起始,//PREFIX_SIZE的作用是存放这次开空间的强度的。 if( !ptr )
zmalloc_oom_handler(size);//这个是报错函数的函数指针,报错函数把标准出错stderr重定义为文件,所以需要//刷新,然后abort改进程结束。
#ifdef HAVE_MALLOC_SIZE //如果是非标准Cupdate_zmalloc_stat_alloc(zmalloc_size(ptr)); //这个宏定义中if (_n&(sizeof(long)-1))作用是使开辟的空间为n为long整//倍数减少内存碎片,放到do{}while里是防止这个宏被拆开,开辟的空间大小需要 //记录,因为是多线程的所以用互斥量,used_memory记录开辟总内存大小
return ptr;
#else*((size_t*)ptr) = size;
update_zmalloc_stat_alloc(size+PREFIX_SIZE);
return (char*)ptr+PREFIX_SIZE;
#endif
}