blob: 8182b7153bf81504fdb320f7f16cc029a34ec3d9 [file] [log] [blame]
/***************************************************************************
* Copyright (c) 2014 Amlogic, Inc. All rights reserved.
*
* This source code is subject to the terms and conditions defined in the
* file 'LICENSE' which is part of this source code package.
*
* Description:
*/
/**\file
* \brief 内存分配
*封装动态内存分配函数,支持memwatch内存检查
* \author Gong Ke <ke.gong@amlogic.com>
* \date 2010-05-12: create the document
***************************************************************************/
#ifndef _AM_MEM_H
#define _AM_MEM_H
#include <string.h>
#include "am_util.h"
//#include <memwatch.h>
#ifdef __cplusplus
extern "C"
{
#endif
/****************************************************************************
* Macro definitions
***************************************************************************/
#ifdef AM_DEBUG
#define AM_MEM_ERROR_DEBUG(_s) AM_DEBUG(1, "cannot allocate %d bytes memory", _s)
#else
#define AM_MEM_ERROR_DEBUG(_s)
#endif
/**\brief 内存缓冲区分配*/
#define AM_MEM_Alloc(_size) \
({\
void *_ptr = malloc(_size);\
if (!_ptr) {\
AM_MEM_ERROR_DEBUG(_size);\
}\
_ptr;\
})
/**\brief 重新设定缓冲区大小*/
#define AM_MEM_Realloc(_old,_size) \
({\
void *_ptr=realloc(_old,_size);\
if (!_ptr) {\
AM_MEM_ERROR_DEBUG(_size);\
}\
_ptr;\
})
/**\brief 内存缓冲区释放*/
#define AM_MEM_Free(_ptr) \
AM_MACRO_BEGIN\
if (_ptr) free(_ptr);\
AM_MACRO_END
/**\brief 分配内存并复制字符串*/
#define AM_MEM_Strdup(_str) \
({\
void *_ptr = strdup(_str);\
if (!_ptr) {\
AM_MEM_ERROR_DEBUG(strlen(_str));\
}\
_ptr;\
})
/**\brief 分配内存并将缓冲区清0*/
#define AM_MEM_Alloc0(_size) \
({\
void *_ptr = AM_MEM_Alloc((_size));\
if(_ptr) memset(_ptr, 0, (_size));\
_ptr;\
})
/**\brief 根据类型_type的大小分配内存*/
#define AM_MEM_ALLOC_TYPE(_type) AM_MEM_Alloc(sizeof(_type))
/**\brief 分配_n个类型_type大小的内存*/
#define AM_MEM_ALLOC_TYPEN(_type,_n) AM_MEM_Alloc(sizeof(_type)*(_n))
/**\brief 根据类型_type的大小分配内存,并清0*/
#define AM_MEM_ALLOC_TYPE0(_type) AM_MEM_Alloc0(sizeof(_type))
/**\brief 分配_n个类型_type大小的内存,并清0*/
#define AM_MEM_ALLOC_TYPEN0(_type,_n) AM_MEM_Alloc0(sizeof(_type)*(_n))
/**\brief 从内存池分配一个缓冲区并清0*/
#define AM_MEM_PoolAlloc0(_pool,_size) \
({\
void *_ptr = AM_MEM_PoolAlloc(_pool,_size);\
if(_ptr) memset(_ptr, 0, _size);\
_ptr;\
})
/**\brief 根据类型_type的大小从内存池分配内存*/
#define AM_MEM_POOL_ALLOC_TYPE(_pool,_type) AM_MEM_PoolAlloc(_pool,sizeof(_type))
/**\brief 从内存池分配_n个类型_type大小的内存*/
#define AM_MEM_POOL_ALLOC_TYPEN(_pool,_type,_n) AM_MEM_PoolAlloc(_pool,sizeof(_type)*(_n))
/**\brief 根据类型_type的大小从内存池分配内存,并清0*/
#define AM_MEM_POOL_ALLOC_TYPE0(_pool,_type) AM_MEM_PoolAlloc0(_pool,sizeof(_type))
/**\brief 从内存池分配_n个类型_type大小的内存,并清0*/
#define AM_MEM_POOL_ALLOC_TYPEN0(_pool,_type,_n) AM_MEM_PoolAlloc0(_pool,sizeof(_type)*(_n))
/****************************************************************************
* Type definitions
***************************************************************************/
/**\brief 内存缓冲池
*内存缓冲池在多次分配但统一释放的情况下提高分配效率。
*内存缓冲池每次调用malloc分配一个较大的内存,此后所有的小内存块直接在缓冲池内分配。
*/
typedef struct
{
int pool_size; /**< 每次分配的内存大小*/
void *pools; /**< 内存块链表*/
} AM_MEM_Pool_t;
/****************************************************************************
* Function prototypes
***************************************************************************/
/**\brief 初始化一个缓冲池
* \param[out] pool 需要初始化的缓冲池结构
* \param pool_size 每次调用系统分配函数分配的内存大小
*/
extern void AM_MEM_PoolInit(AM_MEM_Pool_t *pool, int pool_size);
/**\brief 从缓冲池分配内存
* \param[in,out] pool 缓冲池指针
* \param size 要分配的内存大小
* \return
* - 返回分配内存的指针
* - 如果分配失败返回NULL
*/
extern void* AM_MEM_PoolAlloc(AM_MEM_Pool_t *pool, int size);
/**\brief 将缓冲池内全部以分配的内存标记,但不调用系统free()
* \param[in,out] pool 缓冲池指针
*/
extern void AM_MEM_PoolClear(AM_MEM_Pool_t *pool);
/**\brief 将缓冲池内全部以分配的内存标记,调用系统free()释放全部资源
* \param[in,out] pool 缓冲池指针
*/
extern void AM_MEM_PoolFree(AM_MEM_Pool_t *pool);
#ifdef __cplusplus
}
#endif
#endif