acl/lib_acl/include/stdlib/acl_slice.h
2014-11-19 00:25:21 +08:00

136 lines
4.7 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef ACL_SLICE_INCLUDE_H
#define ACL_SLICE_INCLUDE_H
#ifdef __cplusplus
extern "C" {
#endif
#include "acl_define.h"
#define ACL_SLICE_FLAG_OFF (0)
#define ACL_SLICE_FLAG_GC1 (1 << 0) /**< 空间节省, 但 gc 性能差 */
#define ACL_SLICE_FLAG_GC2 (1 << 1) /**< 空间中等, gc 比较好 */
#define ACL_SLICE_FLAG_GC3 (1 << 2) /**< 空间最大, gc 只当顺序时最好 */
#define ACL_SLICE_FLAG_RTGC_OFF (1 << 10) /**< 关闭实时内存释放 */
#define ACL_SLICE_FLAG_LP64_ALIGN (1 << 11) /**< 是否针对64位平台需要按8字节对齐 */
/**
* 内存分片池的状态结构
*/
typedef struct ACL_SLICE_STAT {
int nslots; /**< total slice count free in slots */
int islots; /**< current position of free slots slice */
int page_nslots; /**< count slice of each page */
int page_size; /**< length of each malloc */
int slice_length; /**< length of each slice from user's set */
int slice_size; /**< length of each slice really allocated */
int nbuf; /**< count of MEM_BUF allocated */
acl_uint64 length; /**< total size of all MEM_BUF's buf */
acl_uint64 used_length; /**< total size of used */
unsigned int flag; /**< same as the ACL_SLICE's flag been set when created */
} ACL_SLICE_STAT;
typedef struct ACL_SLICE ACL_SLICE;
/**
* 创建内存片池对象
* @param name {const char*} 标识名称,以便于调试
* @param page_size {int} 分配内存时的分配内存页大小
* @param slice_size {int} 每个固定长度内存片的大小
* @param flag {unsigned int} 标志位参见上述ACL_SLICE_FLAG_xxx
* @return {ACL_SLICE*} 内存片池对象句柄
*/
ACL_API ACL_SLICE *acl_slice_create(const char *name, int page_size,
int slice_size, unsigned int flag);
/**
* 销毁一个内存片池对象
* @param slice {ACL_SLICE*} 内存片池对象
*/
ACL_API void acl_slice_destroy(ACL_SLICE *slice);
/**
* 该内存片池中有多少个内存片正在被使用
* @param slice {ACL_SLICE*} 内存片池对象
* @return {int} >= 0, 正在被使用的内存片个数
*/
ACL_API int acl_slice_used(ACL_SLICE *slice);
/**
* 分配一块内存片
* @param slice {ACL_SLICE*} 内存片池对象
* @return {void*} 内存片地址
*/
ACL_API void *acl_slice_alloc(ACL_SLICE *slice);
/**
* 分配一块内存片且将内存片内容初始化为0
* @param slice {ACL_SLICE*} 内存片池对象
* @return {void*} 内存片地址
*/
ACL_API void *acl_slice_calloc(ACL_SLICE *slice);
/**
* 释放一块内存片
* @param slice {ACL_SLICE*} 内存片池对象
* @param ptr {void*} 内存片地址, 必须是由 acl_slice_alloc/acl_slice_calloc 所分配
*/
ACL_API void acl_slice_free2(ACL_SLICE *slice, void *ptr);
/**
* 释放一块内存片
* @param ptr {void*} 内存片地址, 必须是由 acl_slice_alloc/acl_slice_calloc 所分配
*/
ACL_API void acl_slice_free(void *ptr);
/**
* 查看内存片池的当前状态
* @param slice {ACL_SLICE*} 内存片池对象
* @param sbuf {ACL_SLICE_STAT*} 存储结果, 不能为空
*/
ACL_API void acl_slice_stat(ACL_SLICE *slice, ACL_SLICE_STAT *sbuf);
/**
* 手工将内存片池不用的内存进行释放
* @param slice {ACL_SLICE*} 内存片池对象
* @param {int} 是否已经将所有内存片释放完毕, 0: 否; 1: 是
*/
ACL_API int acl_slice_gc(ACL_SLICE *slice);
/*----------------------------------------------------------------------------*/
typedef struct ACL_SLICE_POOL {
ACL_SLICE **slices; /* the slice array */
int base; /* the base byte size */
int nslice; /* the max number of base size */
unsigned int slice_flag; /* flag: ACL_SLICE_FLAG_GC2[3] | ACL_SLICE_FLAG_RTGC_OFF */
} ACL_SLICE_POOL;
ACL_API void acl_slice_pool_init(ACL_SLICE_POOL *asp);
ACL_API ACL_SLICE_POOL *acl_slice_pool_create(int base, int nslice,
unsigned int slice_flag);
ACL_API void acl_slice_pool_destroy(ACL_SLICE_POOL *asp);
ACL_API int acl_slice_pool_used(ACL_SLICE_POOL *asp);
ACL_API void acl_slice_pool_clean(ACL_SLICE_POOL *asp);
ACL_API void acl_slice_pool_reset(ACL_SLICE_POOL *asp);
ACL_API void acl_slice_pool_free(const char *filename, int line, void *buf);
ACL_API void acl_slice_pool_gc(ACL_SLICE_POOL *asp);
ACL_API void *acl_slice_pool_alloc(const char *filename, int line,
ACL_SLICE_POOL *asp, size_t size);
ACL_API void *acl_slice_pool_calloc(const char *filename, int line,
ACL_SLICE_POOL *asp, size_t nmemb, size_t size);
ACL_API void *acl_slice_pool_realloc(const char *filename, int line,
ACL_SLICE_POOL *asp, void *ptr, size_t size);
ACL_API void *acl_slice_pool_memdup(const char *filename, int line,
ACL_SLICE_POOL *asp, const void *ptr, size_t len);
ACL_API char *acl_slice_pool_strdup(const char *filename, int line,
ACL_SLICE_POOL *asp, const char *str);
ACL_API char *acl_slice_pool_strndup(const char *filename, int line,
ACL_SLICE_POOL *asp, const char *str, size_t len);
#ifdef __cplusplus
}
#endif
#endif