nginx数据结构之ngx_list分析(nginx0.1.0)

2024-03-27 21:48

本文主要是介绍nginx数据结构之ngx_list分析(nginx0.1.0),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


/** Copyright (C) Igor Sysoev*/#ifndef _NGX_LIST_H_INCLUDED_
#define _NGX_LIST_H_INCLUDED_#include <ngx_config.h>
#include <ngx_core.h>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;
};typedef struct {ngx_list_part_t  *last; // 指向当前还有空闲内存的ngx_list_part_s结构体ngx_list_part_t   part; // ngx_list_part_s链表的第一个节点,相当于头指针 /*  size: 每个ngx_list_part_s结构体管理的内存中,分配的粒度,即每个元素的大小nalloc: 每个ngx_list_part_s结构体可以分配几个size大小的内存,nalloc和size是ngx_list_part_s结构体的共同属性,所以放到全局*/size_t            size; ngx_uint_t        nalloc; ngx_pool_t       *pool;
} ngx_list_t;ngx_inline static ngx_int_t ngx_list_init(ngx_list_t *list, ngx_pool_t *pool,ngx_uint_t n, size_t size)
{   // 分配第一个ngx_list_part_t节点if (!(list->part.elts = ngx_palloc(pool, n * size))) {return NGX_ERROR;}// 初始化使用个数为0,list->part.nelts = 0;list->part.next = NULL;// 指向当前可分配内存的节点list->last = &list->part;// 粒度list->size = size;// 每个ngx_list_part_t结构体可分配的块个数list->nalloc = n;list->pool = pool;return NGX_OK;
}/***  the iteration through the list:**  part = &list.part;*  data = part->elts;**  for (i = 0 ;; i++) {**      if (i >= part->nelts) {*          if (part->next == NULL) {*              break;*          }**          part = part->next;*          data = part->elts;*          i = 0;*      }**      ...  data[i] ...**  }*/void *ngx_list_push(ngx_list_t *list);#endif /* _NGX_LIST_H_INCLUDED_ *//** Copyright (C) Igor Sysoev*/#include <ngx_config.h>
#include <ngx_core.h>void *ngx_list_push(ngx_list_t *l)
{void             *elt;ngx_list_part_t  *last;// 指向当前可用的节点last = l->last;// 已使用的个数等于最多能使用的个数,说明已经没有可使用的空间,再分配一个ngx_list_part_tif (last->nelts == l->nalloc) {/* the last part is full, allocate a new list part */// 分配一个新的节点if (!(last = ngx_palloc(l->pool, sizeof(ngx_list_part_t)))) {return NULL;}// 给上面新分配的节点申请固定大小的内存,供他管理if (!(last->elts = ngx_palloc(l->pool, l->nalloc * l->size))) {return NULL;}// 当前新分配的节点已使用块数为0last->nelts = 0;last->next = NULL;// 链成链表,第一个ngx_list_part_t节点充当头指针,可以通过ngx_list_t->part访问l->last->next = last;// 指向当前可使用的ngx_list_part_t节点l->last = last;}// 当前可分配内存的块首地址加上已经使用的内存,即下一个可用块的首地址elt = (char *) last->elts + l->size * last->nelts;// 当前节点已分配内存块数加1last->nelts++;// 返回可使用的内存首地址,在该函数外写入数据return elt;
}

在这里插入图片描述

这篇关于nginx数据结构之ngx_list分析(nginx0.1.0)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/853490

相关文章

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

python中Hash使用场景分析

《python中Hash使用场景分析》Python的hash()函数用于获取对象哈希值,常用于字典和集合,不可变类型可哈希,可变类型不可,常见算法包括除法、乘法、平方取中和随机数哈希,各有优缺点,需根... 目录python中的 Hash除法哈希算法乘法哈希算法平方取中法随机数哈希算法小结在Python中,

Java Stream的distinct去重原理分析

《JavaStream的distinct去重原理分析》Javastream中的distinct方法用于去除流中的重复元素,它返回一个包含过滤后唯一元素的新流,该方法会根据元素的hashcode和eq... 目录一、distinct 的基础用法与核心特性二、distinct 的底层实现原理1. 顺序流中的去重

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

前端如何通过nginx访问本地端口

《前端如何通过nginx访问本地端口》:本文主要介绍前端如何通过nginx访问本地端口的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、nginx安装1、下载(1)下载地址(2)系统选择(3)版本选择2、安装部署(1)解压(2)配置文件修改(3)启动(4)

关于MyISAM和InnoDB对比分析

《关于MyISAM和InnoDB对比分析》:本文主要介绍关于MyISAM和InnoDB对比分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录开篇:从交通规则看存储引擎选择理解存储引擎的基本概念技术原理对比1. 事务支持:ACID的守护者2. 锁机制:并发控制的艺

Nginx 重写与重定向配置方法

《Nginx重写与重定向配置方法》Nginx重写与重定向区别:重写修改路径(客户端无感知),重定向跳转新URL(客户端感知),try_files检查文件/目录存在性,return301直接返回永久重... 目录一.try_files指令二.return指令三.rewrite指令区分重写与重定向重写: 请求

Nginx 配置跨域的实现及常见问题解决

《Nginx配置跨域的实现及常见问题解决》本文主要介绍了Nginx配置跨域的实现及常见问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来... 目录1. 跨域1.1 同源策略1.2 跨域资源共享(CORS)2. Nginx 配置跨域的场景2.1