nginx_alloc

来源:互联网 发布:帝国cms 调用栏目内容 编辑:程序博客网 时间:2024/05/24 07:24


/*
 * Copyright (C) Igor Sysoev
 */




#ifndef _NGX_ALLOC_H_INCLUDED_
#define _NGX_ALLOC_H_INCLUDED_




#include <ngx_config.h>
#include <ngx_core.h>




void *ngx_alloc(size_t size, ngx_log_t *log);
void *ngx_calloc(size_t size, ngx_log_t *log);


#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_ */





/*
 * Copyright (C) Igor Sysoev
 */




#include <ngx_config.h>
#include <ngx_core.h>




ngx_uint_t  ngx_pagesize;
ngx_uint_t  ngx_pagesize_shift;
ngx_uint_t  ngx_cacheline_size;




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);
    }


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


    return p;
}




void *
ngx_calloc(size_t size, ngx_log_t *log)
{
    void  *p;


    p = ngx_alloc(size, log);


    if (p) 
{
        ngx_memzero(p, size);
    }


    return p;
}




#if (NGX_HAVE_POSIX_MEMALIGN)


void *
ngx_memalign(size_t alignment, size_t size, ngx_log_t *log)
{
    void  *p;
    int    err;


// 参考资料  http://hi.baidu.com/freelonely/blog/item/340341077c4d287302088189.html


    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;


    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

原创粉丝点击