ngx_palloc.h
struct ngx_pool_s {
ngx_pool_data_t d; //内存池的数据区域
size_t max; //一次可以分配的最大空间
ngx_pool_t *current; //指向当前内存地址,ngx_chain_t最后一个节点
ngx_chain_t *chain; //缓冲区链表
ngx_pool_large_t *large; //大块内存分配链表
ngx_pool_cleanup_t *cleanup; //清除分配内存
ngx_log_t *log; //日志
};
typedef struct {
u_char *last;//内存中未使用的开始地址
u_char *end; //内存池的结束地址
ngx_pool_t *next; //指向下一个内存池的指针
ngx_uint_t failed; //分配内存失败的次数
} ngx_pool_data_t;
struct ngx_pool_large_s {
ngx_pool_large_t *next; //指向下一个数据块地址
void *alloc; //数据块的指针地址
};
struct ngx_pool_cleanup_s {
ngx_pool_cleanup_pt handler; //此存储的清除函数
void *data; //指向数据的存储地址
ngx_pool_cleanup_t *next; //指向下一个ngx_pool_cleanup_s结构的指针
};
数据结构图
内存分配:
//此函数
void *
ngx_alloc(size_t size, ngx_log_t *log)
{
void *p;
//使用malloc分配一块内存
p = malloc(size);
if (p == NULL) {
ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
"malloc(%uz) failed", size);
}
//生成内存分配日志
ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, log, 0, "malloc: %p:%uz", p, size);
return p;
}
//此函数在调用ngx_alloc函数将内存分配成功后会调用ngx_memzero函数将内存设置为0
void *
ngx_calloc(size_t size, ngx_log_t *log)
{
void *p;
p = ngx_alloc(size, log);
if (p) {
ngx_memzero(p, size);
}
return p;
}
内存池创建:
ngx_pool_t *
ngx_create_pool(size_t size, ngx_log_t *log)
{
ngx_pool_t *p;
//相当于分配一个size大小的内存,ngx_alloc(size, log)
p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log);
if (p == NULL) {
return NULL;
}
p->d.last = (u_char *) p + sizeof(ngx_pool_t);//指向数据未使用内存起始位置,即ngx_pool_t结构体结尾之后位置
p->d.end = (u_char *) p + size;//内存的结束位置
p->d.next = NULL; //指向下一个内存池的指针
p->d.failed = 0; //失败次数
size = size - sizeof(ngx_pool_t);//将size初始化为实际可用内存大小
p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL; //如果size大于内存池的最大内存,max为内存池的最大内存,否则为size
p->current = p; //指向内存池的首地址
p->chain = NULL;
p->large = NULL;
p->cleanup = NULL;
p->log = log;
return p;
}