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)
 

函数

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:初始化内存池
 
xwer_t xwmm_mempool_malloc (struct xwmm_mempool *mp, xwsz_t size, void **membuf)
 XWMM API:从内存池中申请内存
 
xwer_t xwmm_mempool_free (struct xwmm_mempool *mp, void *mem)
 XWMM API:释放内存
 
xwer_t xwmm_mempool_realloc (struct xwmm_mempool *mp, xwsz_t size, void **membuf)
 XWMM API:调整内存大小
 
xwer_t xwmm_mempool_memalign (struct xwmm_mempool *mp, xwsz_t alignment, xwsz_t size, void **membuf)
 XWMM API:从内存池中申请对齐的内存
 
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:初始化对象缓存
 
xwer_t xwmm_mempool_objcache_alloc (struct xwmm_mempool_objcache *oc, void **objbuf)
 XWMM API:从对象缓存中申请一个对象
 
xwer_t xwmm_mempool_objcache_free (struct xwmm_mempool_objcache *oc, void *obj)
 XWMM API:释放对象到对象缓存中
 
xwer_t xwmm_mempool_objcache_reserve (struct xwmm_mempool_objcache *oc, xwsz_t reserved)
 XWMM API:预留对象到对象缓存中
 
xwer_t xwmm_mempool_objcache_get_capacity (struct xwmm_mempool_objcache *oc, xwsz_t *capacity)
 XWMM API:获取对象缓存的容量
 
xwer_t xwmm_mempool_page_find (struct xwmm_mempool_page_allocator *pa, void *mem, struct xwmm_mempool_page **pgbuf)
 依据内存地址查找页
 
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:初始化页分配器
 
xwer_t xwmm_mempool_page_allocate (struct xwmm_mempool_page_allocator *pa, xwsq_t order, struct xwmm_mempool_page **pgbuf)
 XWMM API:申请一页内存
 
xwer_t xwmm_mempool_page_free (struct xwmm_mempool_page_allocator *pa, struct xwmm_mempool_page *pg)
 XWMM API:释放一页内存
 

详细描述

内存池是结合了内存切片分配器与伙伴算法分配器的算法。内存管理的基本单位为页, 一页内存为4096字节,页内存使用伙伴算法分配器管理。 内存池还使用对象缓存算法建立各种小尺寸的块:8字节、16字节、32字节、 64字节、96字节、128字节、160字节、192字节、256字节、320字节、384字节、 512字节、768字节、1024字节、2048字节。 当申请内存大于2048字节,直接分配页内存;当申请的内存小于等于2048字节, 就从尺寸最合适的对象缓存分配器中分配一块内存。

宏定义说明

◆ XWMM_MEMPOOL_OC_1024_PAGE_ODR

#define XWMM_MEMPOOL_OC_1024_PAGE_ODR   (0U)

1024字节分配器所使用的页的阶数

在文件 allocator.h65 行定义.

◆ XWMM_MEMPOOL_OC_128_PAGE_ODR

#define XWMM_MEMPOOL_OC_128_PAGE_ODR   (0U)

128字节分配器所使用的页的阶数

在文件 allocator.h57 行定义.

◆ XWMM_MEMPOOL_OC_160_PAGE_ODR

#define XWMM_MEMPOOL_OC_160_PAGE_ODR   (0U)

160字节分配器所使用的页的阶数

在文件 allocator.h58 行定义.

◆ XWMM_MEMPOOL_OC_16_PAGE_ODR

#define XWMM_MEMPOOL_OC_16_PAGE_ODR   (0U)

16字节分配器所使用的页的阶数

在文件 allocator.h53 行定义.

◆ XWMM_MEMPOOL_OC_192_PAGE_ODR

#define XWMM_MEMPOOL_OC_192_PAGE_ODR   (0U)

192字节分配器所使用的页的阶数

在文件 allocator.h59 行定义.

◆ XWMM_MEMPOOL_OC_2048_PAGE_ODR

#define XWMM_MEMPOOL_OC_2048_PAGE_ODR   (1U)

2048字节分配器所使用的页的阶数

在文件 allocator.h66 行定义.

◆ XWMM_MEMPOOL_OC_256_PAGE_ODR

#define XWMM_MEMPOOL_OC_256_PAGE_ODR   (0U)

256字节分配器所使用的页的阶数

在文件 allocator.h60 行定义.

◆ XWMM_MEMPOOL_OC_320_PAGE_ODR

#define XWMM_MEMPOOL_OC_320_PAGE_ODR   (1U)

320字节分配器所使用的页的阶数

在文件 allocator.h61 行定义.

◆ XWMM_MEMPOOL_OC_32_PAGE_ODR

#define XWMM_MEMPOOL_OC_32_PAGE_ODR   (0U)

32字节分配器所使用的页的阶数

在文件 allocator.h54 行定义.

◆ XWMM_MEMPOOL_OC_384_PAGE_ODR

#define XWMM_MEMPOOL_OC_384_PAGE_ODR   (1U)

384字节分配器所使用的页的阶数

在文件 allocator.h62 行定义.

◆ XWMM_MEMPOOL_OC_512_PAGE_ODR

#define XWMM_MEMPOOL_OC_512_PAGE_ODR   (1U)

512字节分配器所使用的页的阶数

在文件 allocator.h63 行定义.

◆ XWMM_MEMPOOL_OC_64_PAGE_ODR

#define XWMM_MEMPOOL_OC_64_PAGE_ODR   (0U)

64字节分配器所使用的页的阶数

在文件 allocator.h55 行定义.

◆ XWMM_MEMPOOL_OC_768_PAGE_ODR

#define XWMM_MEMPOOL_OC_768_PAGE_ODR   (0U)

768字节分配器所使用的页的阶数

在文件 allocator.h64 行定义.

◆ XWMM_MEMPOOL_OC_8_PAGE_ODR

#define XWMM_MEMPOOL_OC_8_PAGE_ODR   (0U)

8字节分配器所使用的页的阶数

在文件 allocator.h52 行定义.

◆ XWMM_MEMPOOL_OC_96_PAGE_ODR

#define XWMM_MEMPOOL_OC_96_PAGE_ODR   (1U)

96字节分配器所使用的页的阶数

在文件 allocator.h56 行定义.

◆ XWMM_MEMPOOL_PAGE_MAPPING_FREE

#define XWMM_MEMPOOL_PAGE_MAPPING_FREE   (0U)

在文件 page.h31 行定义.

◆ XWMM_MEMPOOL_PAGE_MAPPING_INVAILD

#define XWMM_MEMPOOL_PAGE_MAPPING_INVAILD   (XWPTR_MAX)

在文件 page.h32 行定义.

◆ XWMM_MEMPOOL_PAGE_ORDER_CMB

#define XWMM_MEMPOOL_PAGE_ORDER_CMB   (XWSQ_MAX)

在文件 page.h30 行定义.

◆ XWMM_MEMPOOL_PAGE_SIZE

#define XWMM_MEMPOOL_PAGE_SIZE   (4096U)
注解
  • 页的最小单位是 XWMM_MEMPOOL_PAGE_SIZE
  • 页的阶数n是指,以2的n次方的形式表示的单位页的数量。n阶页的大小是(4K * pow(2, n))。 每页内存的字节数

在文件 allocator.h51 行定义.

◆ XWMM_MEMPOOL_RAWOBJ_DEF

#define XWMM_MEMPOOL_RAWOBJ_DEF (   name,
  pgodr 
)
值:
xwu8_t name[sizeof(struct xwmm_mempool) + \
sizeof(struct xwmm_mempool_page_odrbtree[(pgodr) + 1U]) + \
sizeof(struct xwmm_mempool_page[1U << (pgodr)])]
uint8_t xwu8_t
Definition type.h:194
内存页
Definition page.h:37
内存池
Definition allocator.h:86

定义内存池结构体的RAW内存空间,用于初始化内存池结构体

参数
[in]name内存数组名
[in]pgodr页的数量,以2的pgodr次方形式表示

在文件 allocator.h78 行定义.

函数说明

◆ xwmm_mempool_free()

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.c342 行定义.

343{
344 interface xwmm_mempool_i_allocator * ia;
345 struct xwmm_mempool_page * pg;
346 xwer_t rc;
347
348 XWOS_VALIDATE((mp), "nullptr", -EFAULT);
349
350 if (NULL == mem) {
351 rc = XWOK;
352 goto do_nothing;
353 }
354
355 rc = xwmm_mempool_page_find(&mp->pa, mem, &pg);
356 if (rc < 0) {
357 goto err_pg_find;
358 }
359
360 switch (pg->data.value) {
361 case 8:
362 ia = (void *)&mp->oc_8;
363 break;
364 case 16:
365 ia = (void *)&mp->oc_16;
366 break;
367 case 32:
368 ia = (void *)&mp->oc_32;
369 break;
370 case 64:
371 ia = (void *)&mp->oc_64;
372 break;
373 case 96:
374 ia = (void *)&mp->oc_96;
375 break;
376 case 128:
377 ia = (void *)&mp->oc_128;
378 break;
379 case 160:
380 ia = (void *)&mp->oc_160;
381 break;
382 case 192:
383 ia = (void *)&mp->oc_192;
384 break;
385 case 256:
386 ia = (void *)&mp->oc_256;
387 break;
388 case 320:
389 ia = (void *)&mp->oc_320;
390 break;
391 case 384:
392 ia = (void *)&mp->oc_384;
393 break;
394 case 512:
395 ia = (void *)&mp->oc_512;
396 break;
397 case 768:
398 ia = (void *)&mp->oc_768;
399 break;
400 case 1024:
401 ia = (void *)&mp->oc_1024;
402 break;
403 case 2048:
404 ia = (void *)&mp->oc_2048;
405 break;
406 default:
407 ia = (void *)&mp->pa;
408 break;
409 }
410 rc = ia->free(ia, mem);
411
412err_pg_find:
413do_nothing:
414 return rc;
415}
xwer_t xwmm_mempool_page_find(struct xwmm_mempool_page_allocator *pa, void *mem, struct xwmm_mempool_page **pgbuf)
依据内存地址查找页
Definition page.c:519
#define EFAULT
Bad address
Definition errno.h:44
#define XWOK
No error
Definition errno.h:182
signed long xwer_t
Definition type.h:554
#define NULL
Definition type.h:28
#define XWOS_VALIDATE(exp, errstr,...)
检查函数参数是否有效
Definition standard.h:76
interface:分配器
Definition i_allocator.h:27
xwsq_t value
Definition page.h:61
union xwmm_mempool_page::@2 data
struct xwmm_mempool_page_allocator pa
Definition allocator.h:88
struct xwmm_mempool_objcache oc_512
Definition allocator.h:100
struct xwmm_mempool_objcache oc_32
Definition allocator.h:91
struct xwmm_mempool_objcache oc_1024
Definition allocator.h:102
struct xwmm_mempool_objcache oc_768
Definition allocator.h:101
struct xwmm_mempool_objcache oc_160
Definition allocator.h:95
struct xwmm_mempool_objcache oc_8
Definition allocator.h:89
struct xwmm_mempool_objcache oc_192
Definition allocator.h:96
struct xwmm_mempool_objcache oc_96
Definition allocator.h:93
struct xwmm_mempool_objcache oc_2048
Definition allocator.h:103
struct xwmm_mempool_objcache oc_256
Definition allocator.h:97
struct xwmm_mempool_objcache oc_128
Definition allocator.h:94
struct xwmm_mempool_objcache oc_384
Definition allocator.h:99
struct xwmm_mempool_objcache oc_320
Definition allocator.h:98
struct xwmm_mempool_objcache oc_64
Definition allocator.h:92
struct xwmm_mempool_objcache oc_16
Definition allocator.h:90
函数调用图:
这是这个函数的调用关系图:

◆ xwmm_mempool_init()

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.c200 行定义.

203{
204 xwer_t rc;
205 struct xwmm_mempool_page_odrbtree * odrbtrees;
206 xwsz_t odrbtrees_size;
207 struct xwmm_mempool_page * pages;
208 xwsz_t pages_nr;
209 xwsz_t pages_size;
210 void * mem;
211
212 XWOS_VALIDATE((mp), "nullptr", -EFAULT);
213
214 pages_nr = size / XWMM_MEMPOOL_PAGE_SIZE;
215 if (pages_nr != (1U << pgodr)) {
216 rc = - ESIZE;
217 goto err_size;
218 }
219
220 odrbtrees = (struct xwmm_mempool_page_odrbtree *)&mp[(xwsz_t)1];
221 pages = (struct xwmm_mempool_page *)&odrbtrees[pgodr + (xwsz_t)1];
222 odrbtrees_size = sizeof(struct xwmm_mempool_page_odrbtree) *
223 (pgodr + (xwsz_t)1);
224 pages_size = sizeof(struct xwmm_mempool_page) << pgodr;
225 rc = xwmm_mempool_construct(mp, name, origin, size, odrbtrees, pages);
226 if (rc < 0) {
227 goto err_mempool_construct;
228 }
229
230 if (pre > (xwsz_t)0) {
231 rc = xwmm_mempool_malloc(mp, pre, &mem);
232 if (rc < 0) {
233 goto err_mempool_prealloc;
234 }
235 if (NULL != membuf) {
236 *membuf = mem;
237 }
238 } else if ((xwptr_t)mp == origin) {
239 xwsz_t mpsz = sizeof(struct xwmm_mempool) + odrbtrees_size + pages_size;
240 if (mpsz < XWMM_MEMPOOL_PAGE_SIZE) {
242 }
243 rc = xwmm_mempool_malloc(mp, mpsz, &mem);
244 if (rc < 0) {
245 goto err_mempool_prealloc;
246 }
247 if (NULL != membuf) {
248 *membuf = mem;
249 }
250 } else {}
251 return XWOK;
252
253err_mempool_prealloc:
254err_mempool_construct:
255err_size:
256 return rc;
257}
static xwer_t xwmm_mempool_construct(struct xwmm_mempool *mp, const char *name, xwptr_t origin, xwsz_t size, struct xwmm_mempool_page_odrbtree *odrbtree, struct xwmm_mempool_page *pgarray)
构建内存池
Definition allocator.c:42
xwer_t xwmm_mempool_malloc(struct xwmm_mempool *mp, xwsz_t size, void **membuf)
XWMM API:从内存池中申请内存
Definition allocator.c:260
#define XWMM_MEMPOOL_PAGE_SIZE
Definition allocator.h:51
#define ESIZE
Size error
Definition errno.h:199
unsigned long xwsz_t
Definition type.h:339
unsigned long xwptr_t
Definition type.h:375
函数调用图:

◆ xwmm_mempool_malloc()

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 ,返回值为负的错误码。
  • 内存不会被初始化;
  • size0 , 通过 *membuf 返回 NULL ,返回错误码为 XWOK

<No error

< 内存管理对齐的字节数

< 内存管理对齐的字节数

在文件 allocator.c260 行定义.

261{
262 interface xwmm_mempool_i_allocator * ia;
263 xwssq_t odr;
264 xwer_t rc;
265
266 XWOS_VALIDATE((mp), "nullptr", -EFAULT);
267 XWOS_VALIDATE((membuf), "nullptr", -EFAULT);
268
269 if ((xwsz_t)0 == size) {
270 rc = XWOK;
271 *membuf = NULL;
272 } else {
273 size = XWBOP_ALIGN(size, (xwsz_t)XWMM_ALIGNMENT);
274 odr = xwbop_fls(xwsz_t, size);
275 while (((xwsz_t)1 << (xwsz_t)odr) < size) {
276 odr++;
277 }
278 // cppcheck-suppress [misra-c2012-17.8]
279 size = (xwsz_t)1 << (xwsz_t)odr;
280
281 switch (size) {
282 case 8:
283 ia = (void *)&mp->oc_8;
284 break;
285 case 16:
286 ia = (void *)&mp->oc_16;
287 break;
288 case 32:
289 ia = (void *)&mp->oc_32;
290 break;
291 case 64:
292 ia = (void *)&mp->oc_64;
293 break;
294 case 128:
295 if (size <= (xwsz_t)96) {
296 ia = (void *)&mp->oc_96;
297 } else {
298 ia = (void *)&mp->oc_128;
299 }
300 break;
301 case 256:
302 if (size <= (xwsz_t)160) {
303 ia = (void *)&mp->oc_160;
304 } else if (size <= (xwsz_t)192) {
305 ia = (void *)&mp->oc_192;
306 } else {
307 ia = (void *)&mp->oc_256;
308 }
309 break;
310 case 512:
311 if (size <= (xwsz_t)320) {
312 ia = (void *)&mp->oc_320;
313 } else if (size <= (xwsz_t)384) {
314 ia = (void *)&mp->oc_384;
315 } else {
316 ia = (void *)&mp->oc_512;
317 }
318 break;
319 case 1024:
320 if (size <= (xwsz_t)768) {
321 ia = (void *)&mp->oc_768;
322 } else {
323 ia = (void *)&mp->oc_1024;
324 }
325 break;
326 case 2048:
327 ia = (void *)&mp->oc_2048;
328 break;
329 default:
330 ia = (void *)&mp->pa;
331 break;
332 }
333 rc = ia->malloc(ia, size, membuf);
334 if (rc < 0) {
335 *membuf = NULL;
336 }
337 }
338 return rc;
339}
#define XWMM_ALIGNMENT
Definition common.h:29
signed long xwssq_t
Definition type.h:461
#define xwbop_fls(type, data)
XWOS BOPLIB:在数据中从最高位起查找第一个被置1的位
Definition xwbop.h:169
#define XWBOP_ALIGN(x, n)
Definition xwbop.h:37
xwer_t(* malloc)(void *, xwsz_t, void **)
Definition i_allocator.h:29
这是这个函数的调用关系图:

◆ xwmm_mempool_memalign()

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内存不足
注解
  • 同步/异步:同步
  • 上下文:中断、中断底半部、线程
  • 重入性:可重入
  • 此API类似于C标准中的 memalign() 函数:
    • alignment 如果比 XWMM_ALIGNMENT 小,会被扩大为 XWMM_ALIGNMENT
    • alignment 只能是2的n次方:
    • 若size小于 alignmentsize 会被扩大为 alignment
    • 若size大于 alignmentsize 会向上对齐到2的n次方,此时也一定为 alignment 的整数倍。
  • 申请内存失败时,此函数不会修改 *membuf 的值。

< 内存管理对齐的字节数

< 内存管理对齐的字节数

<No error

在文件 allocator.c467 行定义.

470{
471 interface xwmm_mempool_i_allocator * ia;
472 xwssq_t p2;
473 xwer_t rc;
474
475 XWOS_VALIDATE((mp), "nullptr", -EFAULT);
476 XWOS_VALIDATE((membuf), "nullptr", -EFAULT);
477
478 if (alignment < XWMM_ALIGNMENT) {
479 alignment = XWMM_ALIGNMENT;
480 }
481 p2 = xwbop_fls(xwsz_t, alignment);
482 if (((xwsz_t)1 << (xwsz_t)p2) != alignment) {
483 rc = -EINVAL;
484 goto err_notp2;
485 }
486 if ((xwsz_t)0 == size) {
487 rc = XWOK;
488 *membuf = NULL;
489 goto nothing;
490 }
491 if (size <= alignment) {
492 size = alignment;
493 } else {
494 p2 = xwbop_fls(xwsz_t, size);
495 while (((xwsz_t)1 << (xwsz_t)p2) < size) {
496 p2++;
497 }
498 size = (xwsz_t)1 << (xwsz_t)p2;
499 }
500
501 switch (size) {
502 case 8:
503 ia = (void *)&mp->oc_8;
504 break;
505 case 16:
506 ia = (void *)&mp->oc_16;
507 break;
508 case 32:
509 ia = (void *)&mp->oc_32;
510 break;
511 case 64:
512 ia = (void *)&mp->oc_64;
513 break;
514 case 128:
515 ia = (void *)&mp->oc_128;
516 break;
517 case 256:
518 ia = (void *)&mp->oc_256;
519 break;
520 case 512:
521 ia = (void *)&mp->oc_512;
522 break;
523 case 1024:
524 ia = (void *)&mp->oc_1024;
525 break;
526 case 2048:
527 ia = (void *)&mp->oc_2048;
528 break;
529 default:
530 ia = (void *)&mp->pa;
531 break;
532 }
533 rc = ia->malloc(ia, size, membuf);
534
535nothing:
536err_notp2:
537 return rc;
538}
#define EINVAL
Invalid argument
Definition errno.h:52

◆ xwmm_mempool_objcache_alloc()

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.c263 行定义.

264{
265 struct xwmm_mempool_page * pg;
266 xwlfq_t * obj;
267 xwreg_t flag;
268 xwer_t rc;
269
270 rc = xwmm_mempool_objcache_page_get(oc, &pg);
271 if (rc < 0) {
272 goto err_page_get;
273 }
274
275 xwaop_sub(xwsz_t, &oc->idleness, 1, NULL, NULL);
277 XWOS_BUG_ON(NULL == obj);
278 *obj = oc->backup;
279 *objbuf = (void *)obj;
280
283 pg->attr.objcache.refcnt++;
285 if (pg->attr.objcache.refcnt == oc->pg_objnr) {
287 } else {
289 }
291
292 return XWOK;
293
294err_page_get:
295 return rc;
296}
static void xwlib_bclst_add_tail(struct xwlib_bclst_node *head, struct xwlib_bclst_node *newn)
将一个节点加入链表尾部(链表头的前面)
Definition bclst.h:357
static void xwlib_bclst_add_head(struct xwlib_bclst_node *head, struct xwlib_bclst_node *newn)
将一个节点加入链表头部(链表头的后面)
Definition bclst.h:345
static void xwlib_bclst_del_init(struct xwlib_bclst_node *node)
删除一个节点,并重新初始化它
Definition bclst.h:391
static xwlfq_t * xwlib_lfq_pop(atomic_xwlfq_t *h)
弹出无锁队列中的第一个节点(栈式队列)
Definition lfq.h:53
xwptr_t xwlfq_t
Definition type.h:591
xwptr_t xwreg_t
Definition type.h:409
#define xwaop_sub(type, a, v, nv, ov)
对原子变量进行原子操作:读取-相减-回写
Definition xwaop.h:598
static void xwos_sqlk_wr_lock_cpuirqsv(struct xwos_sqlk *sql, xwreg_t *cpuirq)
XWOS API:开启写临界区,保存本地CPU的中断标志并关闭
Definition seqlock.h:580
static void xwos_sqlk_wr_unlock_cpuirqrs(struct xwos_sqlk *sql, xwreg_t cpuirq)
XWOS API:关闭写临界区,恢复本地CPU的中断标志
Definition seqlock.h:613
#define XWOS_BUG_ON(x)
Definition standard.h:57
static xwer_t xwmm_mempool_objcache_page_get(struct xwmm_mempool_objcache *oc, struct xwmm_mempool_page **pgbuf)
获取一页,准备从页内存中分配对象
Definition objcache.c:225
struct xwlib_bclst_node full
Definition objcache.h:55
struct xwos_sqlk lock
Definition objcache.h:58
struct xwlib_bclst_node available
Definition objcache.h:56
atomic_xwsz_t idleness
Definition objcache.h:51
struct xwmm_mempool_objcache::@0 page_list
struct xwlib_bclst_node node
Definition page.h:51
union xwmm_mempool_page::@1 attr
xwsq_t refcnt
Definition page.h:53
atomic_xwlfq_t objhead
Definition page.h:52
struct xwmm_mempool_page::@1::@4 objcache
函数调用图:
这是这个函数的调用关系图:

◆ xwmm_mempool_objcache_free()

xwer_t xwmm_mempool_objcache_free ( struct xwmm_mempool_objcache oc,
void *  obj 
)

XWMM API:释放对象到对象缓存中

参数
[in]oc对象缓存的指针
[in]obj对象的指针
返回
错误码
返回值
XWOK没有错误
-ERANGE内存地址不在内存池的范围内

<No error

在文件 objcache.c299 行定义.

300{
301 atomic_xwlfq_t * lfq;
302 struct xwmm_mempool_page * pg;
303 xwsz_t reserved;
304 xwsz_t idleness;
305 xwptr_t offset;
306 xwptr_t origin;
307 xwer_t rc;
308
309 rc = xwmm_mempool_page_find(oc->pa, obj, &pg);
310 if (rc < 0) {
311 goto err_pg_find;
312 }
313
314 offset = ((xwptr_t)obj - pg->mapping) % oc->objsize;
315 origin = (xwptr_t)obj - offset;
316 obj = (void *)origin;
317
318 if (NULL != oc->dtor) {
319 oc->dtor(obj);
320 }
321
322 lfq = (atomic_xwlfq_t *)obj;
324
326 xwaop_add(xwsz_t, &oc->idleness, 1, &idleness, NULL);
327 reserved = xwaop_load(xwsz_t, &oc->reserved, xwaop_mo_relaxed);
328
329 if ((reserved + oc->pg_objnr) <= idleness) {
330 xwsz_t nr;
331
332 nr = (idleness - reserved) / oc->pg_objnr;
333 // cppcheck-suppress [misra-c2012-17.7]
335 }
336
337 return XWOK;
338
339err_pg_find:
340 return rc;
341}
static void xwlib_lfq_push(atomic_xwlfq_t *h, atomic_xwlfq_t *n)
将一个节点推入无锁队列(栈式队列)
Definition lfq.h:42
__xwcc_atomic xwlfq_t atomic_xwlfq_t
Definition type.h:594
@ xwaop_mo_relaxed
Definition type.h:628
#define xwaop_load(type, a, memorder)
对原子变量进行原子操作:加载
Definition xwaop.h:45
#define xwaop_add(type, a, v, nv, ov)
对原子变量进行原子操作:读取-相加-回写
Definition xwaop.h:330
static xwsz_t xwmm_mempool_objcache_free_idle_page(struct xwmm_mempool_objcache *oc, xwsz_t nr)
释放空闲页
Definition objcache.c:160
static void xwmm_mempool_objcache_page_put(struct xwmm_mempool_objcache *oc, struct xwmm_mempool_page *pg)
减少页的引用计数
Definition objcache.c:197
struct xwmm_mempool_page_allocator * pa
Definition objcache.h:36
atomic_xwsz_t reserved
Definition objcache.h:52
xwptr_t mapping
Definition page.h:40
函数调用图:
这是这个函数的调用关系图:

◆ xwmm_mempool_objcache_get_capacity()

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.c383 行定义.

385{
386 *capacity = xwaop_load(xwsz_t, &oc->capacity, xwaop_mo_relaxed);
387 return XWOK;
388}
atomic_xwsz_t capacity
Definition objcache.h:50

◆ xwmm_mempool_objcache_init()

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.c54 行定义.

59{
60 xwsz_t nr;
61 xwsz_t pgsize;
62
63/*
64 * ----------------------------
65 * | struct xwmm_mempool_page |
66 * -----------------------------------------------------------------------------
67 * | attr.objcache.objhead |->| obj | a | obj | a | obj | a | ...
68 * |--------------------------|-------------------------------------------------
69 * | ... | | ^ | ^ | ^
70 * |--------------------------| |___| |___| |___|
71 * obj: object
72 * a: alignment area
73 */
74
75 alignment = XWBOP_ALIGN(alignment, (xwsz_t)XWMM_ALIGNMENT);
76 objsize = XWBOP_ALIGN(objsize, (xwsz_t)alignment);
77 if (NULL != ctor) {
78 xwu8_t obj[objsize];
79 ctor((void *)obj);
80 oc->backup = *((xwptr_t *)obj);
81 } else {
82 oc->backup = 0;
83 }
84
85 pgsize = pa->pgsize << pg_order;
86 nr = pgsize / objsize;
87
88 oc->name = name;
89 oc->pa = pa;
90 oc->objsize = objsize;
91 oc->alignment = alignment;
92 oc->pg_order = pg_order;
93 oc->pg_objnr = nr;
94 oc->ctor = ctor;
95 oc->dtor = dtor;
96 oc->capacity = 0;
97 oc->idleness = 0;
98 oc->reserved = 0;
105
106 return XWOK;
107}
static void xwlib_bclst_init_head(struct xwlib_bclst_node *h)
初始化一个链表头。
Definition bclst.h:229
static void xwos_sqlk_init(struct xwos_sqlk *sql)
XWOS API:初始化顺序锁
Definition seqlock.h:133
static xwer_t xwmm_mempool_objcache_i_a_malloc(void *this, xwsz_t size, void **membuf)
i_allocator接口函数:申请内存
Definition objcache.c:400
static xwer_t xwmm_mempool_objcache_i_a_free(void *this, void *mem)
i_allocator接口函数:释放内存
Definition objcache.c:430
xwer_t(* free)(void *, void *)
Definition i_allocator.h:31
struct xwlib_bclst_node idle
Definition objcache.h:57
struct xwmm_mempool_i_allocator i_a
Definition objcache.h:35
const char * name
Definition objcache.h:37
函数调用图:
这是这个函数的调用关系图:

◆ xwmm_mempool_objcache_reserve()

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.c344 行定义.

346{
347 struct xwmm_mempool_page * pg;
348 xwsz_t capacity;
349 xwsz_t idleness;
350 xwreg_t flag;
351 xwer_t rc;
352
353 reserved = XWBOP_DIV_ROUND_UP(reserved, oc->pg_objnr);
354 xwaop_write(xwsz_t, &oc->reserved, reserved, NULL);
355 capacity = xwaop_load(xwsz_t, &oc->capacity, xwaop_mo_relaxed);
356 idleness = xwaop_load(xwsz_t, &oc->idleness, xwaop_mo_relaxed);
357 if (capacity < reserved) {
358 rc = xwmm_mempool_page_allocate(oc->pa, oc->pg_order, &pg);
359 if (rc < 0) {
360 goto err_pg_alloc;
361 }
368 } else if ((reserved + oc->pg_objnr) < idleness) {
369 xwsz_t nr;
370
371 nr = (idleness - reserved) / oc->pg_objnr;
372 // cppcheck-suppress [misra-c2012-17.7]
374 } else {
375 }
376 return XWOK;
377
378err_pg_alloc:
379 return rc;
380}
xwer_t xwmm_mempool_page_allocate(struct xwmm_mempool_page_allocator *pa, xwsq_t order, struct xwmm_mempool_page **pgbuf)
XWMM API:申请一页内存
Definition page.c:159
#define xwaop_write(type, a, v, ov)
对原子变量进行原子操作:读取—写
Definition xwaop.h:91
#define XWBOP_DIV_ROUND_UP(n, d)
Definition xwbop.h:31
static void xwmm_mempool_objcache_page_init(struct xwmm_mempool_objcache *oc, struct xwmm_mempool_page *pg)
初始化新页
Definition objcache.c:115
函数调用图:

◆ xwmm_mempool_page_allocate()

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

在文件 page.c159 行定义.

162{
163 xwsq_t odr;
164 struct xwmm_mempool_page_odrbtree * ot;
165 struct xwmm_mempool_page * pg;
166 xwptr_t origin;
167 xwer_t rc;
168
169 rc = -ENOMEM;
170 for (odr = order; odr <= pa->max_order; odr++) {
171 ot = &pa->odrbtree[odr];
173 if (NULL != pg) {
175 origin = pa->zone.origin + (pg->attr.free.seq * pa->pgsize);
176 pg->mapping = origin;
177 *pgbuf = pg;
178 rc = XWOK;
179 break;
180 }
181 }
182 return rc;
183}
#define ENOMEM
Not enough space
Definition errno.h:42
unsigned long xwsq_t
Definition type.h:445
static void xwmm_mempool_page_divide_page(struct xwmm_mempool_page_allocator *pa, struct xwmm_mempool_page *pg, xwsq_t target_odr, struct xwmm_mempool_page_odrbtree *ot)
将大的页拆分成小的页
Definition page.c:222
static struct xwmm_mempool_page * xwmm_mempool_page_odrbtree_choose(struct xwmm_mempool_page_odrbtree *ot)
从阶红黑树中选择一页
Definition page.c:416
struct xwmm_zone zone
Definition page.h:85
struct xwmm_mempool_page_odrbtree * odrbtree
Definition page.h:89
xwsq_t seq
Definition page.h:48
struct xwmm_mempool_page::@1::@3 free
xwsq_t order
Definition page.h:38
xwptr_t origin
Definition common.h:41
函数调用图:
这是这个函数的调用关系图:

◆ xwmm_mempool_page_allocator_init()

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

在文件 page.c86 行定义.

91{
92 xwsz_t i;
93 xwssq_t order;
94 xwsz_t nr;
95 xwer_t rc;
96
97 if (size < pgsize) {
98 rc = -E2SMALL;
99 goto err_mem2small;
100 }
101 // cppcheck-suppress [misra-c2012-10.8]
102 if ((xwsz_t)0 != (pgsize & (xwsz_t)XWMM_UNALIGNED_MASK)) {
103 rc = -EALIGN;
104 goto err_aligned;
105 }
106 nr = size / pgsize;
107 order = xwbop_fls(xwsz_t, nr);
108 if ((order < 0) || (nr & ((1U << (xwsz_t)order) - 1U))) {
109 rc = -EALIGN;
110 goto err_aligned;
111 }
112
113 pa->zone.origin = origin;
114 pa->zone.size = size;
115 pa->name = name;
116 pa->pgsize = pgsize;
117 pa->max_order = (xwsq_t)order;
118 pa->odrbtree = odrbtree;
119 pa->pgarray = pgarray;
120
121 for (i = 0; i <= pa->max_order; i++) {
123 pa->odrbtree[i].leftmost = NULL;
124 pa->odrbtree[i].owner = pa;
125 pa->odrbtree[i].order = i;
127 }
128 for (i = 0; i < nr; i++) {
131 pa->pgarray[i].attr.free.seq = i;
133 pa->pgarray[i].data.value = 0;
134 }
135 // cppcheck-suppress [misra-c2012-17.7]
137 &pa->pgarray[0]);
138
141
142 return XWOK;
143
144err_aligned:
145err_mem2small:
146 return rc;
147}
#define XWMM_UNALIGNED_MASK
Definition common.h:30
#define XWMM_MEMPOOL_PAGE_ORDER_CMB
Definition page.h:30
#define XWMM_MEMPOOL_PAGE_MAPPING_INVAILD
Definition page.h:32
#define E2SMALL
Too small
Definition errno.h:200
#define EALIGN
Not aligned
Definition errno.h:201
static void xwlib_rbtree_init_node(struct xwlib_rbtree_node *rbn)
初始化红黑树节点
Definition rbtree.h:114
static void xwlib_rbtree_init(struct xwlib_rbtree *rbt)
初始化红黑树
Definition rbtree.h:104
static xwer_t xwmm_mempool_page_i_a_malloc(void *this, xwsz_t size, void **membuf)
i_allocator接口函数:申请内存
Definition page.c:549
static xwer_t xwmm_mempool_page_i_a_free(void *this, void *mem)
i_allocator接口函数:释放内存
Definition page.c:580
static xwer_t xwmm_mempool_page_odrbtree_add(struct xwmm_mempool_page_odrbtree *ot, struct xwmm_mempool_page *pg)
增加页到阶红黑树中
Definition page.c:293
struct xwmm_mempool_i_allocator i_a
Definition page.h:84
struct xwmm_mempool_page * pgarray
Definition page.h:90
const char * name
Definition page.h:86
struct xwlib_rbtree tree
Definition page.h:73
struct xwmm_mempool_page * leftmost
Definition page.h:74
struct xwos_sqlk lock
Definition page.h:77
struct xwmm_mempool_page_allocator * owner
Definition page.h:76
struct xwlib_rbtree_node rbnode
Definition page.h:47
xwsz_t size
Definition common.h:42
函数调用图:
这是这个函数的调用关系图:

◆ xwmm_mempool_page_find()

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

在文件 page.c519 行定义.

521{
522 xwer_t rc;
523 struct xwmm_mempool_page * pg;
524
525 if (((xwptr_t)mem < pa->zone.origin) ||
526 ((xwptr_t)mem >= (pa->zone.origin + pa->zone.size))) {
527 rc = -ERANGE;
528 } else {
529 pg = xwmm_mempool_mem_to_page(pa, mem);
530 while (XWMM_MEMPOOL_PAGE_ORDER_CMB == pg->order) {
531 pg--;
532 }
533 *pgbuf = pg;
534 rc = XWOK;
535 }
536 return rc;
537}
#define ERANGE
Result too large
Definition errno.h:64
static struct xwmm_mempool_page * xwmm_mempool_mem_to_page(struct xwmm_mempool_page_allocator *pa, void *mem)
从页内存地址获得其页控制块的指针
Definition page.c:477
函数调用图:
这是这个函数的调用关系图:

◆ xwmm_mempool_page_free()

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

在文件 page.c194 行定义.

196{
197 xwer_t rc;
198
200 rc = -EALREADY;
201 goto err_already;
202 }
206 pg->data.value = 0;
208 return XWOK;
209
210err_already:
211 return rc;
212}
#define XWMM_MEMPOOL_PAGE_MAPPING_FREE
Definition page.h:31
#define EALREADY
Socket already connected
Definition errno.h:133
static void xwmm_mempool_page_combine(struct xwmm_mempool_page_allocator *pa, struct xwmm_mempool_page *pg)
合并空闲的伙伴页
Definition page.c:252
static xwsq_t xwmm_mempool_page_get_seq(struct xwmm_mempool_page_allocator *pa, struct xwmm_mempool_page *pg)
获取页的序列值
Definition page.c:459
函数调用图:
这是这个函数的调用关系图:

◆ xwmm_mempool_realloc()

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指向缓冲区的指针,此缓冲区
  • (I) 作为输入时,当*membuf == NULL,realloc等价于malloc
  • (O) 作为输出时,通过此缓冲区返回申请到的内存的首地址
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
-ENOMEM内存不足
-ERANGE内存地址不在内存池的范围内
注解
  • 同步/异步:同步
  • 上下文:中断、中断底半部、线程
  • 重入性:可重入
  • 此API类似于C11标准中的 realloc() 函数:
    • *membufNULL ,此函数等价于 xwmm_mempool_mealloc(mp, size, membuf)
    • *membuf 不为 NULLsize0 , 此函数等价于 xwmm_mempool_free(mp, *membuf) ,并且通过 *membuf 返回 NULL
    • *membuf 不为 NULLsize 比之前的小 ,此函数不重新申请内存,直接返回原来的 *membuf 以及 XWOK
    • *membuf 不为 NULLsize 比之前的大 ,此函数会尝试重新申请内存:
      • 如果申请失败,原来的内存不会受影响,且通过 *membuf 返回 NULL 以及 错误码;
      • 如果申请成功,会将旧内存空间的内容移动到新内存空间内,然后返回新的 *membuf 以及 XWOK

<No error

<No error

<No error

<No error

<No error

在文件 allocator.c418 行定义.

419{
420 xwer_t rc;
421
422 XWOS_VALIDATE((mp), "nullptr", -EFAULT);
423 XWOS_VALIDATE((membuf), "nullptr", -EFAULT);
424
425 if (NULL == *membuf) {
426 rc = xwmm_mempool_malloc(mp, size, membuf);
427 } else if ((xwsz_t)0 == size) {
428 rc = xwmm_mempool_free(mp, *membuf);
429 if (XWOK == rc) {
430 *membuf = NULL;
431 }
432 } else {
433 struct xwmm_mempool_page * pg;
434 void * oldmem;
435 void * newmem;
436
437 oldmem = *membuf;
438 rc = xwmm_mempool_page_find(&mp->pa, oldmem, &pg);
439 if (XWOK == rc) {
440 if (size <= pg->data.value) {
441 rc = XWOK;
442 } else {
443 rc = xwmm_mempool_malloc(mp, size, &newmem);
444 if (XWOK == rc) {
445 // cppcheck-suppress [misra-c2012-17.7]
446 memcpy(newmem, oldmem, pg->data.value);
447 rc = xwmm_mempool_free(mp, oldmem);
448 if (XWOK == rc) {
449 *membuf = newmem;
450 } else {
451 // cppcheck-suppress [misra-c2012-17.7]
452 xwmm_mempool_free(mp, newmem);
453 *membuf = NULL;
454 }
455 } else {
456 *membuf = NULL;
457 }
458 }
459 } else {
460 *membuf = NULL;
461 }
462 }
463 return rc;
464}
xwer_t xwmm_mempool_free(struct xwmm_mempool *mp, void *mem)
XWMM API:释放内存
Definition allocator.c:342
函数调用图: