nginx源码完全注释(1)ngx_alloc.h / ngx_alloc.c
首先看 ngx_alloc.h 文件,主要声明或宏定义了 ngx_alloc,ngx_calloc,ngx_memalign,ngx_free。
/*
 * Copyright (C) Igor Sysoev
 * Copyright (C) Nginx, Inc.
 */
#ifndef _NGX_ALLOC_H_INCLUDED_
#define _NGX_ALLOC_H_INCLUDED_
#include
#include 
void *ngx_alloc(size_t size, ngx_log_t *log);
void *ngx_calloc(size_t size, ngx_log_t *log);
// 宏命名 free 为 ngx_free,Nginx 的习惯
#define ngx_free          free
/*
 * Linux has memalign() or posix_memalign()
 * Solaris has memalign()
 * FreeBSD 7.0 has posix_memalign(), besides, early version's malloc()
 * aligns allocations bigger than page size at the page boundary
 */
#if (NGX_HAVE_POSIX_MEMALIGN || NGX_HAVE_MEMALIGN)
void *ngx_memalign(size_t alignment, size_t size, ngx_log_t *log);
#else
#define ngx_memalign(alignment, size, log)  ngx_alloc(size, log)
#endif
// 声明三个可以被外部使用的变量
extern ngx_uint_t  ngx_pagesize;
extern ngx_uint_t  ngx_pagesize_shift;
extern ngx_uint_t  ngx_cacheline_size;
#endif /* _NGX_ALLOC_H_INCLUDED_ */
再来看 ngx_alloc.c,实现了内存分配函数 ngx_alloc,ngx_calloc,ngx_
/*
 * Copyright (C) Igor Sysoev
 * Copyright (C) Nginx, Inc.
 */
#include
#include 
ngx_uint_t  ngx_pagesize;
ngx_uint_t  ngx_pagesize_shift;
ngx_uint_t  ngx_cacheline_size;
/*
 * 封装malloc,增加分配失败判断及调试日志
 */
void *
ngx_alloc(size_t size, ngx_log_t *log)
{
    void  *p;
    p = malloc(size);
    if (p == NULL) {
        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
                      "malloc(%uz) failed", size);
    }
    /* 在编译时指定debug模式是否开启,如果不开启则此句仅是括号中的逗号表达式 */
    ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, log, 0, "malloc: %p:%uz", p, size);
    return p;
}
/*
 * 封装ngx_alloc,如果分配成功,初始化为0
 */
void *
ngx_calloc(size_t size, ngx_log_t *log)
{
    void  *p;
    p = ngx_alloc(size, log);
    /* 初始化为 0 */
    if (p) {
        ngx_memzero(p, size);
    }
    return p;
}
#if (NGX_HAVE_POSIX_MEMALIGN)
// 封装 posix_memalign,如果是 Solaris 则封装 memalign
void *
ngx_memalign(size_t alignment, size_t size, ngx_log_t *log)
{
    void  *p;
    int    err;
    /*
     * 背景:
     *      1)POSIX 1003.1d
     *      2)POSIX 标明了通过malloc( ), calloc( ), 和 realloc( ) 返回的地址对于
     *      任何的C类型来说都是对齐的
     * 功能:由posix_memalign分配的内存空间,需要由free释放。
     * 参数:
     *      p           分配好的内存空间的首地址
     *      alignment   对齐边界,Linux中,32位系统是8字节,64位系统是16字节
     *      size        指定分配size字节大小的内存
     *
     * 要求:
     *      1)要求alignment是2的幂,并且是p指针大小的倍数
     *      2)要求size是alignment的倍数
     * 返回:
     *      0       成功
     *      EINVAL  参数不满足要求
     *      ENOMEM  内存分配失败
     * 注意:
     *      1)该函数不影响errno,只能通过返回值判断
     *
     */
    err = posix_memalign(&p, alignment, size);
    if (err) {
        ngx_log_error(NGX_LOG_EMERG, log, err,
                      "posix_memalign(%uz, %uz) failed", alignment, size);
        p = NULL;
    }
    ngx_log_debug3(NGX_LOG_DEBUG_ALLOC, log, 0,
                   "posix_memalign: %p:%uz @%uz", p, size, alignment);
    return p;
}
#elif (NGX_HAVE_MEMALIGN)
void *
ngx_memalign(size_t alignment, size_t size, ngx_log_t *log)
{
    void  *p;
    // 与 posix_memalign 的不同是其将分配好的内存块首地址做为返回值
    p = memalign(alignment, size);
    if (p == NULL) {
        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
                      "memalign(%uz, %uz) failed", alignment, size);
    }
    ngx_log_debug3(NGX_LOG_DEBUG_ALLOC, log, 0,
                   "memalign: %p:%uz @%uz", p, size, alignment);
    return p;
}
#endif
nginx源码完全注释(1)ngx_alloc.h / ngx_alloc.c的更多相关文章
- Nginx源码完全注释(6)core/murmurhash
		下面是摘自 Google Code 的 Murmurhash 开源项目主页上的 Murmurhash2,Nginx 就是采用的这个. uint32_t MurmurHash2 ( const void ... 
- Nginx 源码完全注释(11)ngx_spinlock
		Nginx 是多进程模式的,一个 master 与多个 workers,一般工作在多核 CPU 上,所以自旋锁就是必须用到的.Nginx 中的自旋锁的定义,位于 ngx_spinlock.c 中,如下 ... 
- Nginx源码完全注释(7)ngx_palloc.h/ngx_palloc.c
		ngx_palloc.h /* * NGX_MAX_ALLOC_FROM_POOL should be (ngx_pagesize - 1), i.e. 4095 on x86. * On Windo ... 
- Nginx源码完全注释(2)ngx_array.h / ngx_array.c
		数组头文件 ngx_array.h #include <ngx_config.h> #include <ngx_core.h> struct ngx_array_s { voi ... 
- Nginx源码完全注释(4)ngx_queue.h / ngx_queue.c
		队列头文件ngx_queue.h #include <ngx_config.h> #include <ngx_core.h> #ifndef _NGX_QUEUE_H_INCL ... 
- Nginx源码完全注释(3)ngx_list.h / ngx_list.c
		列表头文件ngx_list.h #ifndef _NGX_LIST_H_INCLUDED_ #define _NGX_LIST_H_INCLUDED_ #include <ngx_config. ... 
- Nginx 源码完全注释(10)ngx_radix_tree
		ngx_radix_tree.h // 未被使用的节点 #define NGX_RADIX_NO_VALUE (uintptr_t) -1 typedef struct ngx_radix_node_ ... 
- Nginx源码完全注释(9)nginx.c: ngx_get_options
		本文分析 ngxin.c 中的 ngx_get_options 函数,其影响: nginx.c 中的: static ngx_uint_t ngx_show_help; static ngx_uint ... 
- Nginx源码完全注释(8)ngx_errno.c
		errno.h中的strerror(int errno)可以确定指定的errno的错误的提示信息.在 Nginx 中,将所有错误提示信息预先存储在一个数组里,而预先确定这个数组的大小,是在自动化脚本中 ... 
随机推荐
- groovy && java  混编 gradle 配置
			参考配置: apply plugin: "application" apply plugin: "java" apply plugin: "groov ... 
- jQuery的deferred对象详解(转载)
			jQuery的开发速度很快,几乎每半年一个大版本,每两个月一个小版本.(由于无法转载,复制原文 .原文链接——原作者:阮一峰) 每个版本都会引入一些新功能.今天我想介绍的,就是从jQuery 1.5. ... 
- ubuntu 12.04 下 Vim 插件 YouCompleteMe 的安装
			作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4137402.html 1.需要保证vim的版本大于7.3.584,否则的话需要更新vim 可 ... 
- kali openvas安装
			最新的kali需要用apt-get安装后使用 安装 apt-get install openvas 自动设置 openvas-setup 检测设置 openvas-check-setup 如果检测没有 ... 
- 轻量级封装DbUtils&Mybatis之二Dbutils
			DbUtils入门 Apache出品的极为轻量级的Jdbc访问框架,核心类只有两个:QueryRunner和ResultSetHandler. 各类ResultSetHandler: ArrayHan ... 
- Unit03: Spring Web MVC简介 、 基于XML配置的MVC应用 、 基于注解配置的MVC应用
			Unit03: Spring Web MVC简介 . 基于XML配置的MVC应用 . 基于注解配置的MVC应用 springmvc (1)springmvc是什么? 是一个mvc框架,用来简化基于mv ... 
- git log 中文乱码的解决方案
			设置 Git 支持 utf-8 编码在命令行下输入以下命令:$ git config --global core.quotepath false # 显示 status 编码$ git config ... 
- centos初始化安装
			1.yum 安装 nginx rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6. ... 
- Linux:WebServer(Apacge)
			/ + 内容:表示在文本中搜索该内容: :q!:不保存直接退出: chown -R imooc:imooc /data:将 /data 文件夹的权限所有人该为用户 imooc: -R:采用递归的方 ... 
- 获取响应里面的cookie的方法
			使用方法: R.cookies.get_dict() 获取响应返回的cookies 
