当前位置:首页 > 开发 > 开源软件 > 正文

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

发表于: 2011-12-24   作者:100Continue   来源:转载   浏览:
摘要:   需求: 由于Nginx源码中并没有提供ngx_realloc和ngx_prealloc方法,因此在2011年10月,为Tengine(淘宝版Nginx)源码贡献这两个方法的实现;   解决方案: 在介绍解决方案之前,需要先介绍下realloc的功能定义:   Linux中man realloc的结果 写道 DESCRIPTION realloc

 

需求:

由于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, 全部介绍完毕。

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

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
iOS 系统自带的 View 组件都是正方形的,看起来都太生硬,有时候我需要变成圆角形式,如下图: 具体
By 何明桂(http://blog.csdn.net/hmg25)转载请注明出处 之前在网上看到有篇文章:Launcher之Dock
By 何明桂(http://blog.csdn.net/hmg25)转载请注明出处 之前在网上看到有篇文章:Launcher之Dock
By 何明桂(http://blog.csdn.net/hmg25) 转载请注明出处 Android原生自带的preview不是很好看,很
By 何明桂(http://blog.csdn.net/hmg25)转载请注明出处 之前在网上看到有篇文章:Launcher之Dock
http://blog.csdn.net/hmg25/archive/2011/03/30/6289725.aspx Android原生自带的preview不是很好看
之前在网上看到有篇文章:Launcher之Dock细节篇http://news.wangmeng.cn/detailNews/2716-the-artic
介于UPUPW Nginx版独创的网站目录up-rewrite.conf伪静态支持文件,Discuz添加Nginx伪静态rewrite规
在前面一篇文章中,我们通过对HtmlHelper的扩展简化了对DropDownList(Single-Line-Select)和ListB
我们都知道,get方法,主要用来显示数据,检索之类,对数据一般不会修改。这次我做一个测试为Index
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号