默写nginx并逐句分析 - ngx_buf.c

#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;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值