#include <ngx_config.h>
#include <ngx_core.h>
ngx_buf_t * ngx_creat_temp_buf(ngx_pool_t *pool, size_t size)//在内存中创建一个ngx_buf_t的对象,并返回指针
{
ngx_buf_t *b;
b = ngx_calloc_buf(pool);//内存池pool创建一个ngx_buf_t大小的内存地址
if(b == NULL){
return NULL;
}
b->start = ngx_palloc(pool, size);
if(b->start == NULL){
return NULL;
}
b->pos = b->start;
b->next = b->start;
b->end = b->start + size;
b->temporary = 1;//表示在内存中
return b;
}
ngx_chain_t * ngx_alloc_chain_link(ngx_pool_t *pool){//从内存池pool中的链表取一个出来,如果没有链表,则从pool中请求一段空间
ngx_chain_t * cl;
cl = pool->chain;
if(cl){
pool->chain = cl->next;//因为cl会被使用,所以将链表向前移一下
reutnr cl;
}
cl = ngx_palloc(pool, sizeof(ngx_chain_t));
if(cl == NULL){
return NULL;
}
return cl;
}
ngx_chain_t *ngx_create_chain_of_bufs(ngx_pool_t *pool, ngx_bufs_t *bufs){//在内存池pool中创建一个bufs->num长度的bufs->size大小的链表
ngx_chain_t **ll, *chain;
ngx_pool_t *p;
ngx_int_t i;
ngx_buf_t *b;
p = ngx_palloc(pool, bufs->size * bufs->num);//申请内存
if(p == NULL){
return NULL;
}
ll = &chain;
for(i=0; i<bufs->num; i++){
b = ngx_calloc_buf(pool);//在内存池创建一个ngx_buf_t对象
if(b == NULL){
return NULL;
}
b->pos = p;
b->last = p;
b->temporary = 1;
b->start = p ;
p += bufs->size;
b->end = p;
cl = ngx_alloc_chain_link(pool);
if(cl == NULL){
return NULL;
}
cl->buf = b;
*ll = cl;//将上一个链表的next指向下一个链表
ll = &cl->next;
}
*ll = NULL;
return chain;
}
ngx_chain_t * ngx_chain_add_copy(ngx_pool_t *pool, ngx_chain_t **chain, ngx_chain_t *in){
ngx_chain_t **ll, *cl;
ll = chain;
for(cl = *chain; cl; cl = cl->next){//找到chain链表的结尾,然后指给ll
ll = &cl->next;
}
while(in){
cl = ngx_alloc_chain_link(pool);
if(cl == NULL){
return NGX_ERROR;
}
cl->buf = in->buf;//开始复制
*ll = cl;//将next指向cl
ll = &cl->next;//将ll指针移向新的cl的next
in = in->next;//in向下移
}
*ll = NULL;
return NGX_OK;
}
ngx_chain_t * ngx_chain_get_free_buf(ngx_pool_t *p, ngx_chain_t **free){//获取一个可用的ngx_chain_t节点,上面需要有一个可用的ngx_buf_t
ngx_chain_t *cl;
if(*free){
cl = *free;
*free = cl->next;//不太明白为什么再移动指针
cl->next = NULL;
return NULL;
}
cl = ngx_alloc_chain_link(p);//程序执行到这里表示free是个空指针,需要申请请空间
if(cl == NULL){
return NULL;
}
cl->buf = ngx_alloc_buf(p);//申请新的buf空间
if(cl->buf == NULL){
return NULL;
}
cl->next = NULL;
return cl;
}
//把busy与out相连,释放tag相同的地方,将空闲部分与free相连
void ngx_chain_update_chains(ngx_chain_t **free, ngx_chain_t **busy, ngx_chain_t **out, ngx_buf_tag_t tag){
ngx_chain_t *cl;
if(*busy == NULL){
*busy = *out;
}else{
for(cl = *busy; cl; cl = cl->next){}
cl->next = *out;
}
*out = NULL;
while(*busy){
if(ngx_buf_size((*busy)->buf) != 0){
break;
}
if((*busy)->buf->tag != tag){
*busy = (*busy)->next;
continue;
}
(*busy)->buf->pos = (*busy)->buf->start;
(*busy)->buf->last = (*busy)->buf->start;
cl = *busy;//将链表向后移
*busy = cl->next;
cl->next = *free;
$free = cl;
}
}
默写nginx并逐句分析 - ngx_buf.c
最新推荐文章于 2024-04-18 09:00:52 发布