`
Poechant
  • 浏览: 229525 次
博客专栏
Bebe66e7-3a30-3fc9-aeea-cfa3b474b591
Nginx高性能Web服务...
浏览量:24321
5738817b-23a1-3a32-86de-632d7da73b1e
Cumulus实时媒体服务...
浏览量:22104
社区版块
存档分类
最新评论

Nginx源码完全注释(3)ngx_list.h / ngx_list.c

 
阅读更多

Nginx源码完全注释(3)ngx_list.h / ngx_list.c

  • 作者:柳大·Poechant(钟超)
  • 邮箱:zhongchao.ustc#gmail.com(# -> @)
  • 博客:Blog.CSDN.net/Poechant
  • 日期:August 16th, 2012

列表头文件ngx_list.h


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

// 一个 part 相当于列表的一个节点
struct ngx_list_part_s {
    void             *elts; // 数据存储区
    ngx_uint_t        nelts; // 已存储元素个数
    ngx_list_part_t  *next; //下一个 part
};

// 列表定义
typedef struct {
    ngx_list_part_t  *last; // 最后一个part的位置
    ngx_list_part_t   part; // 表头
    size_t            size;
    ngx_uint_t        nalloc; // 列表单个节点的最大元素数
    ngx_pool_t       *pool; // 内存池
} ngx_list_t;


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

static ngx_inline ngx_int_t
ngx_list_init(ngx_list_t *list, ngx_pool_t *pool, ngx_uint_t n, size_t size)
{
    // 为 list 的第一个元素的数据存储区分配 n * size 的大小
    list->part.elts = ngx_palloc(pool, n * size); 
    if (list->part.elts == NULL) {
        return NGX_ERROR;
    }

    list->part.nelts = 0; // 已存元素数为 0
    list->part.next = NULL;
    list->last = &list->part; // 当前可用,就是表头节点
    list->size = size; // 列表每个节点的每个元素的大小(字节数)
    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_ */

列表源文件ngx_list.c


#include <ngx_config.h>
#include <ngx_core.h>

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

    // 链表定义
    list = ngx_palloc(pool, sizeof(ngx_list_t));
    if (list == NULL) {
        return NULL;
    }

    // 链表表头节点的数据存储区
    list->part.elts = ngx_palloc(pool, n * size);
    if (list->part.elts == NULL) {
        return NULL;
    }

    // 链表表头节点的已存元素数为 0
    list->part.nelts = 0;
    list->part.next = NULL;
    list->last = &list->part;
    list->size = size;
    list->nalloc = n;
    list->pool = pool;

    // 返回这个创建好的列表
    return list;
}

// 插入一个元素到列表中
void *
ngx_list_push(ngx_list_t *l)
{
    void             *elt;
    ngx_list_part_t  *last;

    last = l->last;

    // 最后一个节点的已存元素数 == 列表的单个节点的最大元素数,就是需要分配新节点了
    if (last->nelts == l->nalloc) {

        /* the last part is full, allocate a new list part */

        // 从列表的内存池,分配一个节点出来给 last
        last = ngx_palloc(l->pool, sizeof(ngx_list_part_t));
        if (last == NULL) {
            return NULL;
        }

        // 从列表的内存池,分配空间给最后一个节点的数据存储区
        last->elts = ngx_palloc(l->pool, l->nalloc * l->size);
        if (last->elts == NULL) {
            return NULL;
        }

        // 最后一个节点的已存元素数为 0
        last->nelts = 0;
        last->next = NULL;

        // 新搞出来这个节点,接到最后一个节点后边
        l->last->next = last;
        // 把这个新节点当成最后一个节点
        l->last = last;
    }

    // 最后一个节点的数据存储区起始位置 + 元素大小 * 最后节点的已存元素数
    // 就是下一个可以放元素的位置
    elt = (char *) last->elts + l->size * last->nelts;
    
    // 最后一个节点的已存元素数加1
    last->nelts++;

    // 返回下一个可以放元素的位置
    return elt;
}

从上面可以看出,create 是从 pool 分配定义 list 结构的内存,分配表头节点的内存。init 是初始化已有的 list。

Reference

  1. http://blog.csdn.net/v_july_v/article/details/7040425
  2. http://www.cnblogs.com/sld666666/archive/2010/06/27/1766255.html
  3. http://www.cnblogs.com/jzhlin/archive/2012/06/05/Nginx_pool.html
  4. http://code.google.com/p/nginxsrp/wiki/NginxCodeReview#ngx的内存池

-

转载请注明来自柳大Poechant(钟超Michael)的CSDN博客:

钟超Michael的博客:Blog.CSDN.net/Poechant

钟超Michael的微博:钟超Michael的新浪微博

-

分享到:
评论

相关推荐

    Nginx的SQLite模块ngx_sqlite.zip

    ngx_sqlite 是嵌入 sqlite 数据库的 nginx 模块。通过强大的nginx server,可以使用http协议访问sqlite数据库。环境- sqlite 3- nginx-1.6.3 安装```sh $ git clone https://github.com/rryqszq4/ngx_sqlite.git...

    nginx-1.18.0-2.el7.ngx.x86-64.rpm安装包(含有部署手册)

    nginx-1.18.0-2.el7.ngx.x86_64.rpm安装包(含有部署手册) nginx-1.18.0-2.el7.ngx.x86_64.rpm安装包(含有部署手册) nginx-1.18.0-2.el7.ngx.x86_64.rpm安装包(含有部署手册) nginx-1.18.0-2.el7.ngx.x86_64.rpm...

    ngx_stream_module.so

    nginx1.20.2

    ngx_cache_purge_2.4.2.tar.gz

    ./configure --add-module=../ngx_cache_purge-2.4.2 ``` 4. 编译并安装Nginx,这将同时编译ngx_cache_purge模块。 5. 在Nginx的配置文件中启用该模块,并设置相应的清理规则,如: ``` http { cache_path /...

    ngx_http_dav_ext_module.so

    ngx_http_dav_ext_module.so centos7 nginx 1.18 可以作为模块加载

    nginx的php模块ngx_php.zip

    ngx_php功能是为nginx模块嵌入php脚本语言。别名为php-nginx-module。 特性 * 支持加载php.ini配置文件 * 支持原生php的全局变量$_GET, $_POST, $_COOKIE, $_SERVER, $_FILES, $_SESSION... * 支持运行php代码...

    ngx_http_proxy_connect_module.zip

    3. 编译和安装:运行`./configure`,然后`make`和`make install`以编译并安装带有新模块的Nginx。 4. 配置Nginx服务器块:在Nginx的配置文件(如nginx.conf)中,为需要启用代理服务的域或端口定义一个新的服务器块...

    ngx_devel_kit-0.3.0

    ngx_devel_kit(通常缩写为 NDK)是一个针对Nginx的模块开发工具集,它为构建自定义Nginx模块提供了便利。在Nginx生态系统中,NDK是一个重要的扩展工具,允许开发者利用C语言直接操作Nginx的内部结构,以实现更高级...

    嵌入Python脚本的Nginx模块ngx_python.zip

    ngx_python 是为 nginx 嵌入 python 脚本的模块。环境- python 2.7.*- nginx-1.6.3 安装```sh git clone https://github.com/rryqszq4/ngx_python.git wget 'http://nginx.org/download/nginx-1.6.3.tar.gz' ...

    nginx-1.21.6-1.el7-rtmp.ngx.x86_64.tar.gz

    3. **负载均衡**:如果需要处理大量并发流,可以考虑设置 Nginx 负载均衡,将流分发到多个服务器。 4. **资源管理**:合理配置内存和 CPU 使用限制,避免服务器过载。 5. **备份与恢复**:定期备份配置文件和录制的...

    nginx-1.22.0-1.el7.ngx.x86_64_ngx_rtmp_ipv6.rpm

    2022年5月30日 官方当前最新稳定版本nginx 二进制rpm包 适用于x86架构centos7 rhel7版本操作系统升级安装nginx 该包开启了ipv6支持,添加了nginx-rtmp模块支持

    nginx-1.22.1-1.sles12.ngx.x86-64.rpm文件(分享给需要的同学)

    nginx-1.22.1-1.sles12.ngx.x86_64.rpm文件 nginx-1.22.1-1.sles12.ngx.x86_64.rpm文件 nginx-1.22.1-1.sles12.ngx.x86_64.rpm文件 nginx-1.22.1-1.sles12.ngx.x86_64.rpm文件 nginx-1.22.1-1.sles12.ngx.x86_64.rpm...

    nginx-1.20.0-1.el7.ngx.x86_64.rpm

    nginx-1.20.0-1.el7.ngx.x86_64

    nginx缓存清除插件ngx_cache_purge.zip

    ngx_cache_purge 是 nginx 模块,此模块可以清理 nginx 的 FastCGI、proxy、 SCGI 和 uWSGI 的缓存。配置指令(相同位置语法)fastcgi_cache_purgesyntax: fastcgi_cache_purge on|off|&lt;method&gt; [from all|&lt;ip&gt; [.....

    ngx_devel_kit-0.2.19.tar.gz

    4. 使用Nginx的configure脚本,通过指定--add-module选项添加NDK模块,例如:`./configure --add-module=路径/ngx_devel_kit-0.2.19`。 5. 编译并安装Nginx:`make && make install`。 6. 更新Nginx配置文件,启用...

    nginx-1.6.2-1.el7.centos.ngx.x86_64.rpm

    很难找的 centos7 nginx-1.6.2-1.el7.centos.ngx.x86_64.rpm 包

    nginx-1.14.0-1.el7_4.ngx.x86_64.rpm

    nginx rpm package for centos7 nginx rpm package for centos7 nginx rpm package for centos7 nginx rpm package for centos7 nginx rpm package for centos7 nginx rpm package for centos7 nginx rpm package ...

    nginx-1.18.0-1.el7.ngx.x86_64

    3. 然后,你可以使用 `rpm` 命令安装 Nginx,运行:`sudo rpm -ivh nginx-1.18.0-1.el7.ngx.x86_64.rpm`。这里的 `-i` 表示安装,`-v` 用于显示详细信息,`-h` 是在安装过程中显示进度条。 4. 安装完成后,Nginx ...

    nginx流媒体安装包(nginx_mod_h264_streaming,yamdi)

    ./configure --add-module=path/to/nginx_mod_h264_streaming make sudo make install ``` 3. 配置Nginx - 在Nginx的配置文件(如/etc/nginx/nginx.conf)中,添加流媒体服务器的相关配置。例如,创建一个新的...

    ngx_http_mytest_module.zip_nginx_world

    我们将详细解释Nginx模块的工作原理、开发流程以及如何利用提供的“ngx_http_mytest_module.c”源代码学习和理解Nginx模块开发。 首先,了解Nginx的基本架构至关重要。Nginx是一款高性能的Web服务器,以其反向代理...

Global site tag (gtag.js) - Google Analytics