XWOS API
4.0
XWOS C/C++ API参考手册
|
结构体 | |
struct | xwmm_mempool |
内存池 更多... | |
struct | xwmm_mempool_i_allocator |
interface:分配器 更多... | |
struct | xwmm_mempool_objcache |
对象缓存 更多... | |
struct | xwmm_mempool_page |
内存页 更多... | |
struct | xwmm_mempool_page_odrbtree |
阶红黑树 更多... | |
struct | xwmm_mempool_page_allocator |
页分配器 更多... | |
宏定义 | |
#define | XWMM_MEMPOOL_PAGE_SIZE (4096U) |
#define | XWMM_MEMPOOL_OC_8_PAGE_ODR (0U) |
#define | XWMM_MEMPOOL_OC_16_PAGE_ODR (0U) |
#define | XWMM_MEMPOOL_OC_32_PAGE_ODR (0U) |
#define | XWMM_MEMPOOL_OC_64_PAGE_ODR (0U) |
#define | XWMM_MEMPOOL_OC_96_PAGE_ODR (1U) |
#define | XWMM_MEMPOOL_OC_128_PAGE_ODR (0U) |
#define | XWMM_MEMPOOL_OC_160_PAGE_ODR (0U) |
#define | XWMM_MEMPOOL_OC_192_PAGE_ODR (0U) |
#define | XWMM_MEMPOOL_OC_256_PAGE_ODR (0U) |
#define | XWMM_MEMPOOL_OC_320_PAGE_ODR (1U) |
#define | XWMM_MEMPOOL_OC_384_PAGE_ODR (1U) |
#define | XWMM_MEMPOOL_OC_512_PAGE_ODR (1U) |
#define | XWMM_MEMPOOL_OC_768_PAGE_ODR (0U) |
#define | XWMM_MEMPOOL_OC_1024_PAGE_ODR (0U) |
#define | XWMM_MEMPOOL_OC_2048_PAGE_ODR (1U) |
#define | XWMM_MEMPOOL_RAWOBJ_DEF(name, pgodr) |
定义内存池结构体的RAW内存空间,用于初始化内存池结构体 | |
#define | XWMM_MEMPOOL_PAGE_ORDER_CMB (XWSQ_MAX) |
#define | XWMM_MEMPOOL_PAGE_MAPPING_FREE (0U) |
#define | XWMM_MEMPOOL_PAGE_MAPPING_INVAILD (XWPTR_MAX) |
内存池是结合了内存切片分配器与伙伴算法分配器的算法。内存管理的基本单位为页, 一页内存为4096字节,页内存使用伙伴算法分配器管理。 内存池还使用对象缓存算法建立各种小尺寸的块:8字节、16字节、32字节、 64字节、96字节、128字节、160字节、192字节、256字节、320字节、384字节、 512字节、768字节、1024字节、2048字节。 当申请内存大于2048字节,直接分配页内存;当申请的内存小于等于2048字节, 就从尺寸最合适的对象缓存分配器中分配一块内存。
#define XWMM_MEMPOOL_OC_1024_PAGE_ODR (0U) |
1024字节分配器所使用的页的阶数
在文件 allocator.h 第 65 行定义.
#define XWMM_MEMPOOL_OC_128_PAGE_ODR (0U) |
128字节分配器所使用的页的阶数
在文件 allocator.h 第 57 行定义.
#define XWMM_MEMPOOL_OC_160_PAGE_ODR (0U) |
160字节分配器所使用的页的阶数
在文件 allocator.h 第 58 行定义.
#define XWMM_MEMPOOL_OC_16_PAGE_ODR (0U) |
16字节分配器所使用的页的阶数
在文件 allocator.h 第 53 行定义.
#define XWMM_MEMPOOL_OC_192_PAGE_ODR (0U) |
192字节分配器所使用的页的阶数
在文件 allocator.h 第 59 行定义.
#define XWMM_MEMPOOL_OC_2048_PAGE_ODR (1U) |
2048字节分配器所使用的页的阶数
在文件 allocator.h 第 66 行定义.
#define XWMM_MEMPOOL_OC_256_PAGE_ODR (0U) |
256字节分配器所使用的页的阶数
在文件 allocator.h 第 60 行定义.
#define XWMM_MEMPOOL_OC_320_PAGE_ODR (1U) |
320字节分配器所使用的页的阶数
在文件 allocator.h 第 61 行定义.
#define XWMM_MEMPOOL_OC_32_PAGE_ODR (0U) |
32字节分配器所使用的页的阶数
在文件 allocator.h 第 54 行定义.
#define XWMM_MEMPOOL_OC_384_PAGE_ODR (1U) |
384字节分配器所使用的页的阶数
在文件 allocator.h 第 62 行定义.
#define XWMM_MEMPOOL_OC_512_PAGE_ODR (1U) |
512字节分配器所使用的页的阶数
在文件 allocator.h 第 63 行定义.
#define XWMM_MEMPOOL_OC_64_PAGE_ODR (0U) |
64字节分配器所使用的页的阶数
在文件 allocator.h 第 55 行定义.
#define XWMM_MEMPOOL_OC_768_PAGE_ODR (0U) |
768字节分配器所使用的页的阶数
在文件 allocator.h 第 64 行定义.
#define XWMM_MEMPOOL_OC_8_PAGE_ODR (0U) |
8字节分配器所使用的页的阶数
在文件 allocator.h 第 52 行定义.
#define XWMM_MEMPOOL_OC_96_PAGE_ODR (1U) |
96字节分配器所使用的页的阶数
在文件 allocator.h 第 56 行定义.
#define XWMM_MEMPOOL_PAGE_SIZE (4096U) |
在文件 allocator.h 第 51 行定义.
#define XWMM_MEMPOOL_RAWOBJ_DEF | ( | name, | |
pgodr | |||
) |
定义内存池结构体的RAW内存空间,用于初始化内存池结构体
[in] | name | 内存数组名 |
[in] | pgodr | 页的数量,以2的pgodr次方形式表示 |
在文件 allocator.h 第 78 行定义.
xwer_t xwmm_mempool_free | ( | struct xwmm_mempool * | mp, |
void * | mem | ||
) |
XWMM API:释放内存
[in] | mp | 内存池的指针 |
[in] | mem | 内存的首地址 |
XWOK | 没有错误 |
-EFAULT | 空指针 |
-EALREADY | 页内存已释放 |
-ERANGE | 内存地址不在内存池的范围内 |
此函数向内存池释放内存。内存必须是此前申请的,如果 mem
是错误的地址或之前被释放过, 将产生未定义的错误。 mem
可以为 NULL
,此函数什么也不做,并且返回错误码 XWOK
。
<No error
在文件 allocator.c 第 342 行定义.
xwer_t xwmm_mempool_init | ( | struct xwmm_mempool * | mp, |
const char * | name, | ||
xwptr_t | origin, | ||
xwsz_t | size, | ||
xwsz_t | pgodr, | ||
xwsz_t | pre, | ||
void ** | membuf | ||
) |
XWMM API:初始化内存池
[in] | mp | 内存池的指针 |
[in] | name | 名字 |
[in] | origin | 内存区域的起始地址 |
[in] | size | 内存区域的总大小 |
[in] | pgodr | 页的数量,以2的pgodr次方形式表示 |
[in] | pre | 预申请的内存的大小 |
[out] | membuf | 指向缓冲区的指针,通过此缓冲区返回预申请内存的首地址 |
XWOK | 没有错误 |
-EFAULT | 空指针 |
-E2SMALL | 内存区域太小 |
-ESIZE | 内存区域大小size与pgodr指明的页数量不匹配 |
origin
,大小为 size
的内存初始化为内存池:pgodr
表示,只能是2的n次方,即 2, 4, 8, 16, 32, 64, 128, ...
, 对应的pgodr分别为 1, 2, 3, 4, 5, 6, 7, ...
;size == (XWMM_MEMPOOL_PAGE_SIZE * (1 << pgodr))
。pre
以及 membuf
就是作为此用途而设计的。 membuf
可以为 NULL
,表示不需要返回编译器预先申请内存的首地址。 < 每页内存的字节数
<Size error
< 每页内存的字节数
< 每页内存的字节数
<No error
在文件 allocator.c 第 200 行定义.
xwer_t xwmm_mempool_malloc | ( | struct xwmm_mempool * | mp, |
xwsz_t | size, | ||
void ** | membuf | ||
) |
XWMM API:从内存池中申请内存
[in] | mp | 内存池的指针 |
[in] | size | 申请的大小 |
[out] | membuf | 指向缓冲区的指针,通过此缓冲区返回申请到的内存的首地址 |
XWOK | 没有错误 |
-EFAULT | 空指针 |
-ENOMEM | 内存不足 |
size
的内存:*membuf
返回申请到的内存地址 ,返回错误码为 XWOK
;*membuf
返回 NULL
,返回值为负的错误码。size
为 0
, 通过 *membuf
返回 NULL
,返回错误码为 XWOK
; <No error
< 内存管理对齐的字节数
< 内存管理对齐的字节数
在文件 allocator.c 第 260 行定义.
xwer_t xwmm_mempool_memalign | ( | struct xwmm_mempool * | mp, |
xwsz_t | alignment, | ||
xwsz_t | size, | ||
void ** | membuf | ||
) |
XWMM API:从内存池中申请对齐的内存
[in] | mp | 内存池的指针 |
[in] | alignment | 内存的起始地址对齐的字节数,只能是2的n次方 |
[in] | size | 申请的大小 |
[out] | membuf | 指向缓冲区的指针,通过此缓冲区返回申请到的内存的首地址 |
XWOK | 没有错误 |
-EFAULT | 空指针 |
-ENOMEM | 内存不足 |
memalign()
函数:alignment
如果比 XWMM_ALIGNMENT
小,会被扩大为 XWMM_ALIGNMENT
:alignment
只能是2的n次方:alignment
, size
会被扩大为 alignment
,alignment
, size
会向上对齐到2的n次方,此时也一定为 alignment
的整数倍。*membuf
的值。 < 内存管理对齐的字节数
< 内存管理对齐的字节数
<No error
在文件 allocator.c 第 467 行定义.
xwer_t xwmm_mempool_objcache_alloc | ( | struct xwmm_mempool_objcache * | oc, |
void ** | objbuf | ||
) |
XWMM API:从对象缓存中申请一个对象
[in] | oc | 对象缓存的指针 |
[out] | objbuf | 指向缓冲区的指针,此缓冲区被用于返回对象的指针 |
XWOK | 没有错误 |
-ENOMEM | 内存不足 |
< 报告BUG
< 当条件x成立时报告BUG
< 报告BUG
< 当条件x成立时报告BUG
<No error
在文件 objcache.c 第 263 行定义.
xwer_t xwmm_mempool_objcache_free | ( | struct xwmm_mempool_objcache * | oc, |
void * | obj | ||
) |
XWMM API:释放对象到对象缓存中
[in] | oc | 对象缓存的指针 |
[in] | obj | 对象的指针 |
XWOK | 没有错误 |
-ERANGE | 内存地址不在内存池的范围内 |
<No error
在文件 objcache.c 第 299 行定义.
xwer_t xwmm_mempool_objcache_get_capacity | ( | struct xwmm_mempool_objcache * | oc, |
xwsz_t * | capacity | ||
) |
XWMM API:获取对象缓存的容量
[in] | oc | 对象缓存的指针 |
[out] | capacity | 指向缓冲区的指针,通过此缓冲区返回对象缓存的容量 |
XWOK | 没有错误 |
<No error
在文件 objcache.c 第 383 行定义.
xwer_t xwmm_mempool_objcache_init | ( | struct xwmm_mempool_objcache * | oc, |
struct xwmm_mempool_page_allocator * | pa, | ||
const char * | name, | ||
xwsz_t | objsize, | ||
xwsz_t | alignment, | ||
xwsq_t | pg_order, | ||
ctor_f | ctor, | ||
dtor_f | dtor | ||
) |
XWMM API:初始化对象缓存
[in] | oc | 对象缓存的指针 |
[in] | pa | 页分配器的指针 |
[in] | name | 名字 |
[in] | objsize | 对象的大小 |
[in] | alignment | 对齐的大小 |
[in] | pg_order | 每次预先申请页的数量的阶,几阶就是2的几次方 |
[in] | ctor | 构造函数 |
[in] | dtor | 析构函数 |
XWOK | 没有错误 |
-EALIGN | 内存区域没有对齐 |
< 内存管理对齐的字节数
< 内存管理对齐的字节数
<No error
在文件 objcache.c 第 54 行定义.
xwer_t xwmm_mempool_objcache_reserve | ( | struct xwmm_mempool_objcache * | oc, |
xwsz_t | reserved | ||
) |
XWMM API:预留对象到对象缓存中
[in] | oc | 对象缓存的指针 |
[in] | reserved | 预留的数量 |
XWOK | 没有错误 |
-ENOMEM | 内存不足 |
<No error
在文件 objcache.c 第 344 行定义.
xwer_t xwmm_mempool_page_allocate | ( | struct xwmm_mempool_page_allocator * | pa, |
xwsq_t | order, | ||
struct xwmm_mempool_page ** | pgbuf | ||
) |
XWMM API:申请一页内存
[in] | pa | 页分配器的指针 |
[in] | order | 页数量的阶,页内存大小: ((1 << order) * pa->pgsize) |
[out] | pgbuf | 指向缓冲区的指针,通过此缓冲区返回申请到的页控制块的指针 |
XWOK | 没有错误 |
-ENOMEM | 内存不足 |
<No error
xwer_t xwmm_mempool_page_allocator_init | ( | struct xwmm_mempool_page_allocator * | pa, |
const char * | name, | ||
xwptr_t | origin, | ||
xwsz_t | size, | ||
xwsz_t | pgsize, | ||
struct xwmm_mempool_page_odrbtree * | odrbtree, | ||
struct xwmm_mempool_page * | pgarray | ||
) |
XWMM API:初始化页分配器
[in] | pa | 页分配器的指针 |
[in] | name | 名字 |
[in] | origin | 内存区域的起始地址 |
[in] | size | 内存区域的总大小 |
[in] | pgsize | 单位页的大小 |
[in] | odrbtree | 阶红黑树数组的指针 |
[in] | pgarray | 页控制块数组的指针 |
XWOK | 没有错误 |
-E2SMALL | 内存区域太小 |
-EALIGN | 内存区域没有对齐 |
<Too small
< 内存管理对齐的字节数
< 内存管理未对齐掩码
<Not aligned
<Not aligned
<No error
xwer_t xwmm_mempool_page_find | ( | struct xwmm_mempool_page_allocator * | pa, |
void * | mem, | ||
struct xwmm_mempool_page ** | pgbuf | ||
) |
依据内存地址查找页
[in] | pa | 页分配器的指针 |
[in] | mem | 内存地址 |
[out] | pgbuf | 指向缓冲区的指针,通过此缓冲区返回申请到的页控制块的指针 |
XWOK | 没有错误 |
-ERANGE | 内存地址不在内存池的范围内 |
<No error
xwer_t xwmm_mempool_page_free | ( | struct xwmm_mempool_page_allocator * | pa, |
struct xwmm_mempool_page * | pg | ||
) |
XWMM API:释放一页内存
[in] | pa | 页分配器的指针 |
[in] | pg | 页控制块的指针 |
XWOK | 没有错误 |
-EALREADY | 页内存已释放 |
<No error
xwer_t xwmm_mempool_realloc | ( | struct xwmm_mempool * | mp, |
xwsz_t | size, | ||
void ** | membuf | ||
) |
XWMM API:调整内存大小
[in] | mp | 内存池的指针 |
[in] | size | 申请的大小,当size == 0,realloc等价于free |
[in,out] | membuf | 指向缓冲区的指针,此缓冲区
|
XWOK | 没有错误 |
-EFAULT | 空指针 |
-ENOMEM | 内存不足 |
-ERANGE | 内存地址不在内存池的范围内 |
realloc()
函数:*membuf
为 NULL
,此函数等价于 xwmm_mempool_mealloc(mp, size, membuf)
;*membuf
不为 NULL
且 size
为 0
, 此函数等价于 xwmm_mempool_free(mp, *membuf)
,并且通过 *membuf
返回 NULL
;*membuf
不为 NULL
且 size
比之前的小 ,此函数不重新申请内存,直接返回原来的 *membuf
以及 XWOK
;*membuf
不为 NULL
且 size
比之前的大 ,此函数会尝试重新申请内存:*membuf
返回 NULL
以及 错误码;*membuf
以及 XWOK
。 <No error
<No error
<No error
<No error
<No error
在文件 allocator.c 第 418 行定义.