您的位置:首页 > 运维架构 > Nginx

Nginx源码完全注释(1)ngx_alloc.h / ngx_alloc.c

2016-08-04 09:03 756 查看


Nginx源码完全注释(1)ngx_alloc.h / ngx_alloc.c

作者:柳大·Poechant
时间:2012年7月1日
博客:Blog.CSDN.net/Poechant

首先看 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


-

转载请注明来自柳大的CSDN博客:Blog.CSDN.net/Poechant

-
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  nginx