`
100Continue
  • 浏览: 159763 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

为Nginx源码ngx_alloc.c添加ngx_realloc与ngx_prealloc方法

阅读更多

 

需求:

由于Nginx源码中并没有提供ngx_realloc和ngx_prealloc方法,因此在2011年10月,为Tengine(淘宝版Nginx)源码贡献这两个方法的实现;

 

解决方案:

在介绍解决方案之前,需要先介绍下realloc的功能定义:

 

Linux中man realloc的结果 写道
DESCRIPTION
realloc() changes the size of the memory block pointed to by ptr to size bytes. The contents will be unchanged to the minimum of the old and new sizes; newly allocated memory will be uninitialized. If ptr is NULL, the call is equivalent to malloc(size); if size is equal to zero, the call is equivalent to free(ptr). Unless ptr is NULL, it must have been returned by an earlier call to malloc(), calloc() or realloc(). If the area pointed to was moved, a free(ptr) is done.


RETURN VALUE
realloc() returns a pointer to the newly allocated memory, which is suitably aligned for any kind of variable and may be different from ptr, or NULL if the request fails. If size was equal to 0, either NULL or a pointer suitable to be passed to free() is returned. If realloc() fails the original block is left untouched; it is not freed or moved.

 下面介绍代码实现:

 

// ngx_realloc代码实现及分析	
// 首先定义一个用于返回的new指针,并通过C的realloc方法为传入的指针p重新分配空间,
// 若返回为null则将错误信息写入nginx错误日志,否则将debug信息写入nginx debug日志并返回新地址空间的指针
void *
ngx_realloc(void *p, size_t size, ngx_log_t *log)
{
    void *new;

    new = realloc(p, size);
    if (new == NULL) {
        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
                      "realloc(%p:%uz) failed", p, size);
    }

    ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, log, 0, "realloc: %p:%uz", new, size);

    return new;
}

  // ngx_prealloc代码实现及分析

void *
ngx_prealloc(ngx_pool_t *pool, void *p, size_t old_size, size_t new_size)
{
    void *new;

    // 如果p为空,则相对于在pool中分配一块新空间并返回指向该空间的指针	
    if (p == NULL) {
        return ngx_palloc(pool, new_size);
    }

    // 如果所需重新分配的空间大小为0,则判断旧空间地址是否在pool的最后,
    // 若是,则只需将pool的d.last指针移到旧空间地址的起始位置;
    // 否则,使用ngx_pfree方法是否pool中的旧空间;
    // 最后返回null。	
    if (new_size == 0) {
        if ((u_char *) p + old_size == pool->d.last) {
           pool->d.last = p;
        } else {
           ngx_pfree(pool, p);
        }
	
        return NULL;
    }

    // 如果所需重新分配的空间处于pool的最后,并且pool剩余空间
    // 的大小大于所需分配空间的大小,则只需将pool的d.last指向
    // 新空间的末尾并返回原空间的地址即可。
    if ((u_char *) p + old_size == pool->d.last
		&& (u_char *) p + new_size <= pool->d.end)
    {
        pool->d.last = (u_char *) p + new_size;
        return p;
    }
	
    // 如果以上条件均不符合,则需要通过ngx_palloc在pool内分配
    // 一个新的空间,并在将旧空间内的数据拷贝到新空间内之后,
    // 释放掉旧空间,返回新空间地址。
    new = ngx_palloc(pool, new_size);
    if (new == NULL) {
        return NULL;
    }
	
    ngx_memcpy(new, p, old_size);
	
    ngx_pfree(pool, p);
	
    return new;
}

 

 

ok, 全部介绍完毕。

1
1
分享到:
评论

相关推荐

    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...

    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...

    ngx_stream_module.so

    nginx1.20.2

    嵌入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的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...

    ngx_http_dav_ext_module.so

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

    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模块支持

    ngx_cache_purge_2.4.2.tar.gz

    它的工作原理是监听特定的HTTP方法(通常是POST或PURGE)以及特定的URI,当接收到这样的请求时,模块会遍历Nginx的缓存,并移除与请求匹配的条目。这使得网站管理员无需重启服务器或手动清理缓存,就能确保用户获取...

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

    nginx-1.20.0-1.el7.ngx.x86_64

    ngx_http_proxy_connect_module.zip

    2. 配置Nginx:在编译Nginx时,需要将模块添加到配置选项中。例如,如果你已经下载了Nginx的源代码,可以使用`--add-module=路径/ngx_http_proxy_connect_module`命令行选项。 3. 编译和安装:运行`./configure`,...

    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.16.1-1.el6.ngx.x86_64.rpm

    nginx-1.16.1-1.el6.ngx.x86_64.rpm nginx 最新版 nginx-1.16.1-1.el6.ngx.x86_64.rpm nginx 最新版

    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 ...

    ngx_devel_kit-0.2.19.tar.gz

    ngx_devel_kit是Nginx的一个重要扩展模块,它为Nginx提供了一系列的开发工具,方便开发者在Nginx上构建自定义模块。这个0.2.19版本的压缩包“ngx_devel_kit-0.2.19.tar.gz”包含了用于编译和开发Nginx模块所需的源...

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

    在 Nginx 的配置文件(通常是 `/etc/nginx/nginx.conf`)中,添加 RTMP 模块的配置块: ```nginx rtmp { server { listen 1935; # RTMP 默认端口 chunk_size 4096; application live { allow publish all; ...

    nginx-1.10.0-1.el6.ngx.x86_64.rpm

    nginx-1.10.0-1.el6.ngx.x86_64.rpm 适用于redhat el6

    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; [.....

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

    linux下的nginx--rpm安装包

    nginx-1.18.0-1.el7.ngx.x86_64

    总之,这个 "nginx-1.18.0-1.el7.ngx.x86_64" 压缩包为 CentOS 7 用户提供了一种方便快捷的离线安装 Nginx 的方法,而 "部署.txt" 文件则提供了额外的部署指南,帮助用户顺利完成 Nginx 的安装与配置。对于运维人员...

    nginx-1.8.1-1.el6.ngx.x86_64.rpm

    nginx-1.8.1-1.el6.ngx.x86_64.rpm,linux下快速安装

Global site tag (gtag.js) - Google Analytics