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

相关文章

解决systemctl reload nginx重启Nginx服务报错:Job for nginx.service invalid问题

《解决systemctlreloadnginx重启Nginx服务报错:Jobfornginx.serviceinvalid问题》文章描述了通过`systemctlstatusnginx.se... 目录systemctl reload nginx重启Nginx服务报错:Job for nginx.javas

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re

centos7基于keepalived+nginx部署k8s1.26.0高可用集群

《centos7基于keepalived+nginx部署k8s1.26.0高可用集群》Kubernetes是一个开源的容器编排平台,用于自动化地部署、扩展和管理容器化应用程序,在生产环境中,为了确保集... 目录一、初始化(所有节点都执行)二、安装containerd(所有节点都执行)三、安装docker-

使用Nginx来共享文件的详细教程

《使用Nginx来共享文件的详细教程》有时我们想共享电脑上的某些文件,一个比较方便的做法是,开一个HTTP服务,指向文件所在的目录,这次我们用nginx来实现这个需求,本文将通过代码示例一步步教你使用... 在本教程中,我们将向您展示如何使用开源 Web 服务器 Nginx 设置文件共享服务器步骤 0 —

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

一文带你搞懂Nginx中的配置文件

《一文带你搞懂Nginx中的配置文件》Nginx(发音为“engine-x”)是一款高性能的Web服务器、反向代理服务器和负载均衡器,广泛应用于全球各类网站和应用中,下面就跟随小编一起来了解下如何... 目录摘要一、Nginx 配置文件结构概述二、全局配置(Global Configuration)1. w

Spring中Bean有关NullPointerException异常的原因分析

《Spring中Bean有关NullPointerException异常的原因分析》在Spring中使用@Autowired注解注入的bean不能在静态上下文中访问,否则会导致NullPointerE... 目录Spring中Bean有关NullPointerException异常的原因问题描述解决方案总结