zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    Class类与Java反射《java从入门到精通》第十六章
    maven配置,Java环境变量配置,电脑系统重装之后需要环境配置(大概每年都要一次重装系统)
    Docker部分--尚硅谷2020微服务分布式电商项目《谷粒商城》(没给学习文档,在这做笔记)
    centOS7下载安装(阿里云镜像下载,速度10M/s),(好用免费的工具VirtualBox,FinalShell比xshell更舒服)
    从程序员到项目经理:为什么要当项目经理
    状态图(Statechart Diagram)
    ServiceLoader实现原理
    Java8 lambda表达式10个示例
    Java8函数之旅(四) --四大函数接口
    Java8特性详解 lambda表达式 Stream
  • 原文地址:https://www.cnblogs.com/breg/p/4043532.html
Copyright © 2011-2022 走看看