ITPub博客

首页 > > > 初探nginx- 两个宏使用类似函数

初探nginx- 两个宏使用类似函数

作者:longmanma 时间:2019-12-13 17:40:53 0 删除 编辑

这两个宏使用类似函数,也是不说自明的。

对于创建temporary字段为1的buf(就是其内容可以被后续的filter模块进行修改),可以直接使用函数ngx_create_temp_buf进行创建。

ngx_buf_t *ngx_create_temp_buf(ngx_pool_t *pool, size_t size);

该函数创建一个ngx_but_t类型的对象,并返回指向这个对象的指针,创建失败返回NULL。

对于创建的这个对象,它的start和end指向新分配内存开始和结束的地方。pos和last都指向这块新分配内存的开始处,这样,后续的操作可以在这块新分配的内存上存入数据。

pool:分配该buf和buf使用的内存所使用的pool。

size:该buf使用的内存的大小。

为了配合对ngx_buf_t的使用,nginx定义了以下的宏方便操作。

#define ngx_buf_in_memory(b) (b->temporary || b->memory || b->mmap)

返回这个buf里面的内容是否在内存里。

#define ngx_buf_in_memory_only(b) (ngx_buf_in_memory(b) && !b->in_file)

返回这个buf里面的内容是否仅仅在内存里,并且没有在文件里。

#define ngx_buf_special(b) \

((b->flush || b->last_buf || b->sync) \

&& !ngx_buf_in_memory(b) && !b->in_file)

返回该buf是否是一个特殊的buf,只含有特殊的标志和没有包含真正的数据。

#define ngx_buf_sync_only(b) \

(b->sync \

&& !ngx_buf_in_memory(b) && !b->in_file && !b->flush && !b->last_buf)

返回该buf是否是一个只包含sync标志而不包含真正数据的特殊buf。

#define ngx_buf_size(b) \

(ngx_buf_in_memory(b) ? (off_t) (b->last - b->pos): \

(b->file_last - b->file_pos))

返回该buf所含数据的大小,不管这个数据是在文件里还是在内存里。

ngx_list_t(100%)

ngx_list_t顾名思义,看起来好像是一个list的数据结构。这样的说法,算对也不算对。因为它符合list类型数据结构的一些特点,比如可以添加元素,实现自增长,不会像数组类型的数据结构,受到初始设定的数组容量的限制,并且它跟我们常见的list型数据结构也是一样的,内部实现使用了一个链表。

那么它跟我们常见的链表实现的list有什么不同呢?不同点就在于它的节点,它的节点不像我们常见的list的节点,只能存放一个元素,ngx_list_t的节点实际上是一个固定大小的数组。

在初始化的时候,我们需要设定元素需要占用的空间大小,每个节点数组的容量大小。在添加元素到这个list里面的时候,会在最尾部的节点里的数组上添加元素,如果这个节点的数组存满了,就再增加一个新的节点到这个list里面去。

好了,看到这里,大家应该基本上明白这个list结构了吧?还不明白也没有关系,下面我们来具体看一下它的定义,这些定义和相关的操作函数定义在src/core/ngx_list.h|c文件中。

typedef struct {

ngx_list_part_t *last;

ngx_list_part_t part;

size_t size;

ngx_uint_t nalloc;

ngx_pool_t *pool;

} ngx_list_t;

last:指向该链表的最后一个节点。

part:该链表的首个存放具体元素的节点。

size:链表中存放的具体元素所需内存大小。

nalloc:每个节点所含的固定大小的数组的容量。

pool:该list使用的分配内存的pool。

好,我们在看一下每个节点的定义。

typedef struct ngx_list_part_s ngx_list_part_t;

struct ngx_list_part_s {

void *elts;

ngx_uint_t nelts;

ngx_list_part_t *next;

};

elts:节点中存放具体元素的内存的开始地址。

nelts:节点中已有元素个数。这个值是不能大于链表头节点ngx_list_t类型中的nalloc字段的。

next:指向下一个节点。

我们来看一下提供的一个操作的函数。

ngx_list_t *ngx_list_create(ngx_pool_t *pool, ngx_uint_t n, size_t size);

该函数创建一个ngx_list_t类型的对象,并对该list的第一个节点分配存放元素的内存空间。

pool:分配内存使用的pool。

n:每个节点固定长度的数组的长度。

size:存放的具体元素的个数。

返回值:成功返回指向创建的ngx_list_t对象的指针,失败返回NULL。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/2730/viewspace-3144648/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-12-18

  • 博文量
    492
  • 访问量
    12010