XWOS API  4.0
XWOS C/C++ API参考手册
载入中...
搜索中...
未找到
伙伴算法内存块分配器
伙伴算法内存块分配器 的协作图:

结构体

struct  xwmm_bma_orderlist
 阶链表 更多...
 
struct  xwmm_bma_bcb
 块控制块 更多...
 
struct  xwmm_bma
 伙伴算法内存块分配器 更多...
 

宏定义

#define XWMM_BMA_MAX_ORDER   ((xwu8_t)126)
 
#define XWMM_BMA_COMBINED   ((xwu8_t)127)
 
#define XWMM_BMA_ORDER_MASK   ((xwu8_t)0x7F)
 
#define XWMM_BMA_INUSED   ((xwu8_t)0x80)
 
#define XWMM_BMA_ORDERLIST_SIZE(bo)   sizeof(struct xwmm_bma_orderlist[(bo) + 1U])
 
#define XWMM_BMA_BCB_SIZE(bo)   sizeof(struct xwmm_bma_bcb[1U << (bo)])
 
#define XWMM_BMA_RAWOBJ_DEF(name, blkodr)
 定义伙伴算法内存块分配器结构体的RAW内存空间, 用于初始化伙伴算法内存块分配器结构体
 

函数

xwer_t xwmm_bma_init (struct xwmm_bma *bma, const char *name, xwptr_t origin, xwsz_t size, xwsz_t blksize, xwsz_t blkodr)
 XWMM API:初始化伙伴算法内存块分配器
 
xwer_t xwmm_bma_alloc (struct xwmm_bma *bma, xwsq_t order, void **membuf)
 XWMM API:申请一块连续的内存
 
xwer_t xwmm_bma_free (struct xwmm_bma *bma, void *mem)
 XWMM API:释放内存块
 
xwer_t xwmm_bma_malloc (struct xwmm_bma *bma, xwsz_t size, void **membuf)
 XWMM API:申请指定大小的连续内存
 
xwer_t xwmm_bma_realloc (struct xwmm_bma *bma, xwsz_t size, void **membuf)
 XWMM API:调整内存大小
 
xwer_t xwmm_bma_memalign (struct xwmm_bma *bma, xwsz_t alignment, xwsz_t size, void **membuf)
 XWMM API:申请对齐的内存
 
xwer_t xwmm_bma_malloc_usable_size (struct xwmm_bma *bma, void *mem, xwsz_t *size)
 XWMM API:返回该块内存实际可用字节数
 

详细描述

伙伴算法分配器在分配时,会将内存不断地二等分,直到切割到能满足内存的最小尺寸为止。 释放时会检查与之相邻并等长的内存块(称为伙伴)是否空闲, 如果是,就和“伙伴”合并成更大的内存块, 然后继续检测合并后的内存块是否也存在空闲的伙伴,一直向上合并到不能合并为止。

宏定义说明

◆ XWMM_BMA_MAX_ORDER

#define XWMM_BMA_MAX_ORDER   ((xwu8_t)126)

最大的阶

在文件 bma.h44 行定义.

◆ XWMM_BMA_COMBINED

#define XWMM_BMA_COMBINED   ((xwu8_t)127)

块已被合并

在文件 bma.h45 行定义.

◆ XWMM_BMA_ORDER_MASK

#define XWMM_BMA_ORDER_MASK   ((xwu8_t)0x7F)

阶的掩码

在文件 bma.h46 行定义.

◆ XWMM_BMA_INUSED

#define XWMM_BMA_INUSED   ((xwu8_t)0x80)

块正在被使用

在文件 bma.h47 行定义.

◆ XWMM_BMA_ORDERLIST_SIZE

#define XWMM_BMA_ORDERLIST_SIZE (   bo)    sizeof(struct xwmm_bma_orderlist[(bo) + 1U])

在文件 bma.h49 行定义.

◆ XWMM_BMA_BCB_SIZE

#define XWMM_BMA_BCB_SIZE (   bo)    sizeof(struct xwmm_bma_bcb[1U << (bo)])

在文件 bma.h50 行定义.

◆ XWMM_BMA_RAWOBJ_DEF

#define XWMM_BMA_RAWOBJ_DEF (   name,
  blkodr 
)
值:
xwu8_t name[sizeof(struct xwmm_bma) + \
#define XWMM_BMA_BCB_SIZE(bo)
Definition bma.h:50
#define XWMM_BMA_ORDERLIST_SIZE(bo)
Definition bma.h:49
uint8_t xwu8_t
Definition type.h:194
伙伴算法内存块分配器
Definition bma.h:82
xwsq_t blkodr
Definition bma.h:86

定义伙伴算法内存块分配器结构体的RAW内存空间, 用于初始化伙伴算法内存块分配器结构体

参数
[in]name内存数组名
[in]blkodr伙伴算法内存块分配器中单位内存块的数量,以2的blkodr次方形式表示

在文件 bma.h58 行定义.

函数说明

◆ xwmm_bma_init()

xwer_t xwmm_bma_init ( struct xwmm_bma bma,
const char *  name,
xwptr_t  origin,
xwsz_t  size,
xwsz_t  blksize,
xwsz_t  blkodr 
)

XWMM API:初始化伙伴算法内存块分配器

参数
[in]bma伙伴算法内存块分配器的指针
[in]name名字
[in]origin内存区域的起始地址
[in]size内存区域的大小
[in]blksize伙伴算法内存块分配器中单位内存块的大小
[in]blkodr伙伴算法内存块分配器中单位内存块的数量,以2的blkodr次方形式表示
返回
错误码
返回值
-ESIZE内存区域大小不匹配
注解
  • 单位内存块的数量只能是2的n次方,即 2, 4, 8, 16, 32, 64, 128, ... ,对应的 blkodr 分别为 1, 2, 3, 4, 5, 6, 7, ...
  • 内存区域大小必须满足关系: size == (blksize * (1 << blkodr))
  • 同步/异步:同步
  • 上下文:中断、中断底半部、线程
  • 重入性:不可重入

<Size error

< 块正在被使用

< 块已被合并

< 块正在被使用

<No error

在文件 bma.c63 行定义.

66{
67 xwer_t rc;
68 xwsz_t num;
69 xwsz_t i;
70
71 XWOS_VALIDATE((bma), "nullptr", -EFAULT);
72
73 num = 1U << blkodr;
74 if (size != (num * blksize)) {
75 rc = -ESIZE;
76 xwmm_bmalogf(ERR, "Size of memory(0x%lX, 0x%lX) is error!\n",
77 origin, size);
78 goto err_size;
79 }
80 bma->name = name;
81 bma->zone.origin = origin;
82 bma->zone.size = blksize * num;
83 bma->blksize = blksize;
84 bma->blkodr = blkodr;
85 xwos_splk_init(&bma->lock);
86 bma->orderlists = (struct xwmm_bma_orderlist *)&bma[(xwsz_t)1];
87 bma->bcbs = (struct xwmm_bma_bcb *)&bma->orderlists[(xwsz_t)1 + blkodr];
88 xwmm_bmalogf(DEBUG,
89 "memory:(0x%lX,0x%lX),orderlists:0x%lX,bcbs:0x%lX,"
90 "blocksize:0x%lX, blockorder:0x%lX\n",
91 origin, size, (xwptr_t)bma->orderlists, (xwptr_t)bma->bcbs,
92 bma->blksize, bma->blkodr);
93
94 for (i = 0; i < num; i++) {
96 }
97 bma->bcbs[0].order = (xwu8_t)blkodr | XWMM_BMA_INUSED;
98
99 for (i = 0; i <= blkodr; i++) {
101 }
102 xwmm_bma_orderlist_add(bma, &bma->orderlists[blkodr], blkodr, &bma->bcbs[0]);
103 return XWOK;
104
105err_size:
106 return rc;
107}
static void xwmm_bma_orderlist_add(struct xwmm_bma *bma, struct xwmm_bma_orderlist *ol, xwu8_t odr, struct xwmm_bma_bcb *bcb)
将一块内存加入到阶链表
Definition bma.c:176
#define xwmm_bmalogf(lv, fmt,...)
Definition bma.c:26
#define XWMM_BMA_INUSED
Definition bma.h:47
#define XWMM_BMA_COMBINED
Definition bma.h:45
static void xwlib_bclst_init_head(struct xwlib_bclst_node *h)
初始化一个链表头。
Definition bclst.h:229
#define EFAULT
Bad address
Definition errno.h:44
#define XWOK
No error
Definition errno.h:182
#define ESIZE
Size error
Definition errno.h:199
signed long xwer_t
Definition type.h:554
unsigned long xwsz_t
Definition type.h:339
unsigned long xwptr_t
Definition type.h:375
static void xwos_splk_init(struct xwos_splk *spl)
XWOS API:初始化自旋锁
Definition spinlock.h:85
#define XWOS_VALIDATE(exp, errstr,...)
检查函数参数是否有效
Definition standard.h:76
块控制块
Definition bma.h:72
xwu8_t order
Definition bma.h:73
阶链表
Definition bma.h:65
struct xwlib_bclst_node head
Definition bma.h:66
struct xwmm_zone zone
Definition bma.h:83
struct xwos_splk lock
Definition bma.h:87
struct xwmm_bma_orderlist * orderlists
Definition bma.h:88
const char * name
Definition bma.h:84
struct xwmm_bma_bcb * bcbs
Definition bma.h:89
xwsz_t blksize
Definition bma.h:85
xwptr_t origin
Definition common.h:41
xwsz_t size
Definition common.h:42
函数调用图:

◆ xwmm_bma_alloc()

xwer_t xwmm_bma_alloc ( struct xwmm_bma bma,
xwsq_t  order,
void **  membuf 
)

XWMM API:申请一块连续的内存

参数
[in]bma伙伴算法内存块分配器对象的指针
[in]order块数量的阶,内存块大小: ((1 << order) * bma->blksize)
[out]membuf指向地址缓存的指针,通过此指针缓存返回申请到的内存的首地址
返回
错误码
返回值
-EFAULT空指针
-ERANGEorder无效
-ENOMEM内存不足
注解
  • 同步/异步:同步
  • 上下文:中断、中断底半部、线程
  • 重入性:可重入

<No error

在文件 bma.c312 行定义.

313{
314 xwer_t rc;
315 xwreg_t flag;
316 xwsq_t o;
317 struct xwmm_bma_orderlist * ol;
318 struct xwmm_bma_bcb * bcb;
319
320 XWOS_VALIDATE((bma), "nullptr", -EFAULT);
321 XWOS_VALIDATE((membuf), "nullptr", -EFAULT);
322 XWOS_VALIDATE((order <= (xwsq_t)XWSSQ_MAX), "out-of-range", -ERANGE);
323
324 ol = NULL;
325 bcb = err_ptr(-ENOENT);
326 xwos_splk_lock_cpuirqsv(&bma->lock, &flag);
327 for (o = order; o <= bma->blkodr; o++) {
328 ol = &bma->orderlists[o];
329 bcb = xwmm_bma_orderlist_choose(bma, ol);
330 if (!is_err(bcb)) {
331 break;
332 }
333 }
334 if (is_err(bcb)) { // cppcheck-suppress [misra-c2012-14.4]
335 xwos_splk_unlock_cpuirqrs(&bma->lock, flag);
336 rc = -ENOMEM;
337 *membuf = NULL;
338 } else {
339 xwmm_bmalogf(DEBUG,
340 "[ALLOC] bcb(idx:0x%lX,odr:0x%X)\n",
341 (((xwptr_t)bcb - (xwptr_t)xwmm_bma->bcbs) /
342 sizeof(struct xwmm_bma_bcb)),
343 bcb->order);
344 xwmm_bma_divide_block(bma, bcb, order, ol);
345 xwos_splk_unlock_cpuirqrs(&bma->lock, flag);
346 rc = XWOK;
347 *membuf = xwmm_bma_bcb_to_mem(bma, bcb);
348 }
349 return rc;
350}
static struct xwmm_bma_bcb * xwmm_bma_orderlist_choose(struct xwmm_bma *bma, struct xwmm_bma_orderlist *ol)
从阶链表中选择一块内存,并返回其块控制块
Definition bma.c:245
static void * xwmm_bma_bcb_to_mem(struct xwmm_bma *bma, struct xwmm_bma_bcb *bcb)
从内存块的控制块指针获得内存块的首地址
Definition bma.c:139
static void xwmm_bma_divide_block(struct xwmm_bma *bma, struct xwmm_bma_bcb *bcb, xwsq_t target_odr, struct xwmm_bma_orderlist *curr_ol)
将大内存块分割成小块
Definition bma.c:277
#define ENOENT
No such file or directory
Definition errno.h:32
#define ENOMEM
Not enough space
Definition errno.h:42
#define ERANGE
Result too large
Definition errno.h:64
static __xwcc_inline void *__xwcc_must_check err_ptr(xwer_t err)
将错误码转换为指针
Definition error.h:42
static __xwcc_inline bool __xwcc_must_check is_err(const void *ptr)
测试指针的值是否为错误码
Definition error.h:65
#define NULL
Definition type.h:28
unsigned long xwsq_t
Definition type.h:445
#define XWSSQ_MAX
Definition type.h:473
xwptr_t xwreg_t
Definition type.h:409
static void xwos_splk_unlock_cpuirqrs(struct xwos_splk *spl, xwreg_t cpuirq)
XWOS API:解锁自旋锁,并恢复本地CPU的中断标志
Definition spinlock.h:220
static void xwos_splk_lock_cpuirqsv(struct xwos_splk *spl, xwreg_t *cpuirq)
XWOS API:上锁自旋锁,保存本地CPU的中断标志并关闭
Definition spinlock.h:188
函数调用图:
这是这个函数的调用关系图:

◆ xwmm_bma_free()

xwer_t xwmm_bma_free ( struct xwmm_bma bma,
void *  mem 
)

XWMM API:释放内存块

参数
[in]bma伙伴算法内存块分配器对象的指针
[in]mem内存块的首地址指针
返回
错误码
返回值
XWOK没有错误
-EINVAL参数错误
-ERANGE内存块不属于指定的伙伴算法内存块分配器对象
注解
  • 同步/异步:同步
  • 上下文:中断、中断底半部、线程
  • 重入性:可重入

< 块正在被使用

<No error

在文件 bma.c403 行定义.

404{
405 struct xwmm_bma_bcb * bcb;
406 xwptr_t unaligned;
407 xwreg_t flag;
408 xwer_t rc;
409
410 XWOS_VALIDATE((bma), "nullptr", -EFAULT);
411 XWOS_VALIDATE((mem), "nullptr", -EFAULT);
412
413 if ((((xwptr_t)mem < bma->zone.origin) ||
414 ((xwptr_t)mem >= (bma->zone.origin + bma->zone.size)))) {
415 rc = -ERANGE;
416 goto err_range;
417 }
418 unaligned = ((xwptr_t)mem - bma->zone.origin) % (xwptr_t)bma->blksize;
419 mem = (void *)((xwptr_t)mem - unaligned);
420 bcb = xwmm_bma_mem_to_bcb(bma, mem);
421 if (is_err(bcb)) { // cppcheck-suppress [misra-c2012-14.4]
422 rc = ptr_err(bcb);
423 goto err_invalmem;
424 }
425 xwmm_bmalogf(DEBUG,
426 "[FREE] mem:0x%lX,bcb(idx:0x%lX,odr:0x%X)\n",
427 (xwptr_t)mem,
428 (((xwptr_t)bcb - (xwptr_t)xwmm_bma->bcbs) /
429 sizeof(struct xwmm_bma_bcb)),
430 bcb->order);
431 if (0 == (XWMM_BMA_INUSED & bcb->order)) {
432 rc = -EINVAL;
433 goto err_invalmem;
434 }
435 xwos_splk_lock_cpuirqsv(&bma->lock, &flag);
436 xwmm_bma_combine(bma, bcb);
437 xwos_splk_unlock_cpuirqrs(&bma->lock, flag);
438 return XWOK;
439
440err_invalmem:
441err_range:
442 return rc;
443}
static struct xwmm_bma_bcb * xwmm_bma_mem_to_bcb(struct xwmm_bma *bma, void *mem)
从内存块首地址获得其控制块的指针
Definition bma.c:116
static void xwmm_bma_combine(struct xwmm_bma *bma, struct xwmm_bma_bcb *bcb)
合并内存块
Definition bma.c:359
#define EINVAL
Invalid argument
Definition errno.h:52
static __xwcc_inline xwer_t __xwcc_must_check ptr_err(const void *ptr)
将指针的值转换为错误码
Definition error.h:53
函数调用图:
这是这个函数的调用关系图:

◆ xwmm_bma_malloc()

xwer_t xwmm_bma_malloc ( struct xwmm_bma bma,
xwsz_t  size,
void **  membuf 
)

XWMM API:申请指定大小的连续内存

参数
[in]bma伙伴算法内存块分配器对象的指针
[in]size申请的大小
[out]membuf指向缓冲区的指针,通过此缓冲区返回申请到的内存的首地址
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
-ENOMEM内存不足
注解
  • 同步/异步:同步
  • 上下文:中断、中断底半部、线程
  • 重入性:可重入
  • 此函数向内存池申请大小为 size 的内存:
    • 若申请成功,通过 *membuf 返回申请到的内存地址 ,返回错误码为 XWOK
    • 若申请失败,通过 *membuf 返回 NULL ,返回值为负的错误码。
  • 内存不会被初始化;
  • size0 , 通过 *membuf 返回 NULL ,返回错误码为 XWOK

<No error

在文件 bma.c446 行定义.

447{
448 xwer_t rc;
449 xwsz_t nrblk;
450 xwssq_t p2;
451
452 XWOS_VALIDATE((bma), "nullptr", -EFAULT);
453 XWOS_VALIDATE((membuf), "nullptr", -EFAULT);
454
455 if ((xwsz_t)0 == size) {
456 rc = XWOK;
457 *membuf = NULL;
458 } else {
459 nrblk = XWBOP_DIV_ROUND_UP(size, bma->blksize);
460 p2 = xwbop_fls(xwsz_t, nrblk);
461 while ((p2 < 0) || ((bma->blksize << (xwsz_t)p2) < size)) {
462 p2++;
463 }
464 rc = xwmm_bma_alloc(bma, (xwsq_t)p2, membuf);
465 }
466 return rc;
467}
xwer_t xwmm_bma_alloc(struct xwmm_bma *bma, xwsq_t order, void **membuf)
XWMM API:申请一块连续的内存
Definition bma.c:312
signed long xwssq_t
Definition type.h:461
#define XWBOP_DIV_ROUND_UP(n, d)
Definition xwbop.h:31
#define xwbop_fls(type, data)
在数据中从最高位起查找第一个被置1的位
Definition xwbop.h:169
函数调用图:
这是这个函数的调用关系图:

◆ xwmm_bma_realloc()

xwer_t xwmm_bma_realloc ( struct xwmm_bma bma,
xwsz_t  size,
void **  membuf 
)

XWMM API:调整内存大小

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

<No error

< 阶的掩码

<No error

<No error

在文件 bma.c470 行定义.

471{
472 struct xwmm_bma_bcb * bcb;
473 xwptr_t unaligned;
474 xwsz_t oldsize;
475 xwer_t rc;
476 void * oldm;
477 void * newm;
478
479 XWOS_VALIDATE((bma), "nullptr", -EFAULT);
480 XWOS_VALIDATE((membuf), "nullptr", -EFAULT);
481
482 oldm = *membuf;
483 if (NULL == oldm) {
484 rc = xwmm_bma_malloc(bma, size, membuf);
485 } else if ((xwsz_t)0 == size) {
486 rc = xwmm_bma_free(bma, oldm);
487 if (XWOK == rc) {
488 *membuf = NULL;
489 }
490 } else {
491 if ((((xwptr_t)oldm < bma->zone.origin) ||
492 ((xwptr_t)oldm >= (bma->zone.origin + bma->zone.size)))) {
493 rc = -ERANGE;
494 } else {
495 unaligned = (((xwptr_t)oldm - bma->zone.origin) %
496 (xwptr_t)bma->blksize);
497 oldm = (void *)((xwptr_t)oldm - unaligned);
498 bcb = xwmm_bma_mem_to_bcb(bma, oldm);
499 oldsize = bcb->order & XWMM_BMA_ORDER_MASK;
500 oldsize = (1U << oldsize);
501 if (size <= oldsize) {
502 rc = XWOK;
503 } else {
504 rc = xwmm_bma_malloc(bma, size, &newm);
505 if (XWOK == rc) {
506 // cppcheck-suppress [misra-c2012-17.7]
507 memcpy(newm, oldm, size);
508 *membuf = newm;
509 xwmm_bma_free(bma, oldm);
510 } else {
511 *membuf = NULL;
512 }
513 }
514 }
515 }
516 return rc;
517}
#define XWMM_BMA_ORDER_MASK
Definition bma.h:46
xwer_t xwmm_bma_free(struct xwmm_bma *bma, void *mem)
XWMM API:释放内存块
Definition bma.c:403
xwer_t xwmm_bma_malloc(struct xwmm_bma *bma, xwsz_t size, void **membuf)
XWMM API:申请指定大小的连续内存
Definition bma.c:446
函数调用图:

◆ xwmm_bma_memalign()

xwer_t xwmm_bma_memalign ( struct xwmm_bma bma,
xwsz_t  alignment,
xwsz_t  size,
void **  membuf 
)

XWMM API:申请对齐的内存

参数
[in]bma伙伴算法内存块分配器对象的指针
[in]alignment内存的起始地址对齐的字节数,只能是2的n次方
[in]size申请的大小
[out]membuf指向缓冲区的指针,通过此缓冲区返回申请到的内存的首地址
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
-ENOMEM内存不足
注解
  • 同步/异步:同步
  • 上下文:中断、中断底半部、线程
  • 重入性:可重入
  • 此API类似于C标准中的 aligned_alloc() 函数:
    • alignment 如果比 XWMM_ALIGNMENT 小,会被扩大为 XWMM_ALIGNMENT
    • alignment 只能是2的n次方:
    • 若size小于 alignmentsize 会被扩大为 alignment
    • 若size大于 alignmentsize 会向上对齐到2的n次方,此时也一定为 alignment 的整数倍。
  • 申请内存失败时,此函数不会修改 *membuf 的值。

< 内存管理对齐的字节数

< 内存管理对齐的字节数

<No error

在文件 bma.c520 行定义.

522{
523 xwssq_t p2;
524 xwer_t rc;
525
526 XWOS_VALIDATE((bma), "nullptr", -EFAULT);
527 XWOS_VALIDATE((membuf), "nullptr", -EFAULT);
528
529 if (alignment < XWMM_ALIGNMENT) {
530 alignment = XWMM_ALIGNMENT;
531 }
532 p2 = xwbop_fls(xwsz_t, alignment);
533 if (((xwsz_t)1 << (xwsz_t)p2) != alignment) {
534 rc = -EINVAL;
535 goto err_notp2;
536 }
537 if ((xwsz_t)0 == size) {
538 rc = XWOK;
539 *membuf = NULL;
540 goto nothing;
541 }
542
543 if (size <= alignment) {
544 size = alignment;
545 } else {
546 p2 = xwbop_fls(xwsz_t, size);
547 while (((xwsz_t)1 << (xwsz_t)p2) < size) {
548 p2++;
549 }
550 size = ((xwsz_t)1 << p2);
551 }
552 rc = xwmm_bma_malloc(bma, size, membuf);
553
554nothing:
555err_notp2:
556 return rc;
557}
#define XWMM_ALIGNMENT
Definition common.h:29
函数调用图:

◆ xwmm_bma_malloc_usable_size()

xwer_t xwmm_bma_malloc_usable_size ( struct xwmm_bma bma,
void *  mem,
xwsz_t size 
)

XWMM API:返回该块内存实际可用字节数

参数
[in]bma伙伴算法内存块分配器对象的指针
[in]mem内存块的起始地址
[out]size指向缓冲区的指针,通过此缓冲区返回内存快实际大小
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
-ERANGE内存块不在BMA空间
注解
  • 同步/异步:同步
  • 上下文:中断、中断底半部、线程
  • 重入性:可重入
  • 此API类似于GNUC中的 malloc_usable_size() 函数。

<No error

< 阶的掩码

在文件 bma.c559 行定义.

560{
561 struct xwmm_bma_bcb * bcb;
562 xwptr_t unaligned;
563 xwsz_t realsize;
564 xwer_t rc;
565
566 XWOS_VALIDATE((bma), "nullptr", -EFAULT);
567 XWOS_VALIDATE((size), "nullptr", -EFAULT);
568
569 if ((((xwptr_t)mem < bma->zone.origin) ||
570 ((xwptr_t)mem >= (bma->zone.origin + bma->zone.size)))) {
571 rc = -ERANGE;
572 } else {
573 rc = XWOK;
574 unaligned = (((xwptr_t)mem - bma->zone.origin) % (xwptr_t)bma->blksize);
575 mem = (void *)((xwptr_t)mem - unaligned);
576 bcb = xwmm_bma_mem_to_bcb(bma, mem);
577 realsize = bcb->order & XWMM_BMA_ORDER_MASK;
578 realsize = (1U << realsize);
579 *size = realsize;
580 }
581 return rc;
582}
函数调用图: