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

结构体

struct  xwmm_sma
 简单内存分配器 更多...
 

函数

xwer_t xwmm_sma_init (struct xwmm_sma *sa, xwptr_t origin, xwsz_t size, xwsq_t pos, const char *name)
 XWMM API:初始化简单内存分配器对象
 
xwer_t xwmm_sma_alloc (struct xwmm_sma *sa, xwsz_t size, xwsz_t aligned, void **membuf)
 XWMM API:从简单内存分配器中申请内存
 
xwer_t xwmm_sma_free (struct xwmm_sma *sa, void *mem)
 XWMM API:释放内存
 

详细描述

简单内存分配器只分配大小最适应内存块,不对内存进行回收。

函数说明

◆ xwmm_sma_alloc()

xwer_t xwmm_sma_alloc ( struct xwmm_sma sa,
xwsz_t  size,
xwsz_t  aligned,
void **  membuf 
)

XWMM API:从简单内存分配器中申请内存

参数
[in]sa简单内存分配器对象
[in]size大小
[in]aligned申请到的内存的首地址需要对齐到的边界
[out]membuf指向地址缓存的指针,通过此指针缓存返回申请到的内存的首地址
返回
错误码
返回值
-EFAULT空指针
-EINVAL参数无效
-ENOMEM内存不足
注解
  • 同步/异步:同步
  • 上下文:中断、中断底半部、线程
  • 重入性:可重入

< 内存管理对齐的字节数

< 内存管理未对齐掩码

< 内存管理对齐的字节数

< 内存管理对齐的字节数

< 内存管理对齐的字节数

<No error

<No error

在文件 sma.c41 行定义.

43{
44 xwsq_t cpos;
45 xwsq_t npos;
46 xwsq_t tmp;
47 xwer_t rc;
48
49 XWOS_VALIDATE((sa), "nullptr", -EFAULT);
50 XWOS_VALIDATE((membuf), "nullptr", -EFAULT);
51
52 if ((xwsz_t)0 == size) {
53 rc = -EINVAL;
54 *membuf = NULL;
55 goto err_inval;
56 }
57
58 if ((xwsz_t)0 != (aligned & XWMM_UNALIGNED_MASK)) {
59 rc = -EINVAL;
60 *membuf = NULL;
61 goto err_inval;
62 }
63
64 if ((xwsz_t)0 == aligned) {
65 aligned = XWMM_ALIGNMENT; // cppcheck-suppress [misra-c2012-17.8]
66 }
67
68 // cppcheck-suppress [misra-c2012-17.8]
69 size = XWBOP_ALIGN(size, (xwsz_t)XWMM_ALIGNMENT);
70 do {
72 tmp = XWBOP_ALIGN((sa->zone.origin + cpos), aligned);
73 npos = size + tmp - sa->zone.origin;
74 if (npos > sa->zone.size) {
75 rc = -ENOMEM;
76 *membuf = NULL;
77 goto err_nomem;
78 }
79 *membuf = (void *)tmp;
80 } while (XWOK != xwaop_teq_then_write(xwsq_t, &sa->pos, cpos, npos, NULL));
81 return XWOK;
82
83err_nomem:
84err_inval:
85 return rc;
86}
#define XWMM_ALIGNMENT
Definition common.h:29
#define XWMM_UNALIGNED_MASK
Definition common.h:30
#define EINVAL
Invalid argument
Definition errno.h:52
#define EFAULT
Bad address
Definition errno.h:44
#define ENOMEM
Not enough space
Definition errno.h:42
#define XWOK
No error
Definition errno.h:182
signed long xwer_t
Definition type.h:554
#define NULL
Definition type.h:28
unsigned long xwsz_t
Definition type.h:339
unsigned long xwsq_t
Definition type.h:445
@ xwaop_mo_acquire
Definition type.h:630
#define xwaop_teq_then_write(type, a, t, v, ov)
对原子变量进行原子操作:读取-测试“相等”-写
Definition xwaop.h:113
#define xwaop_load(type, a, memorder)
对原子变量进行原子操作:加载
Definition xwaop.h:45
#define XWBOP_ALIGN(x, n)
Definition xwbop.h:37
#define XWOS_VALIDATE(exp, errstr,...)
检查函数参数是否有效
Definition standard.h:76
struct xwmm_zone zone
Definition sma.h:37
atomic_xwsq_t pos
Definition sma.h:39
xwptr_t origin
Definition common.h:41
xwsz_t size
Definition common.h:42

◆ xwmm_sma_free()

xwer_t xwmm_sma_free ( struct xwmm_sma sa,
void *  mem 
)

XWMM API:释放内存

参数
[in]sa简单内存分配器对象
[in]mem内存的首地址
返回
错误码
注解
  • 同步/异步:同步
  • 上下文:中断、中断底半部、线程
  • 重入性:可重入
  • Dummy函数,简单内存分配器不支持释放内存。

< 去除未使用变量的警告

< 去除未使用变量的警告

<No error

在文件 sma.c89 行定义.

90{
91 XWOS_UNUSED(sa);
92 XWOS_UNUSED(mem);
93 return XWOK;
94}
#define XWOS_UNUSED(x)
Definition standard.h:66

◆ xwmm_sma_init()

xwer_t xwmm_sma_init ( struct xwmm_sma sa,
xwptr_t  origin,
xwsz_t  size,
xwsq_t  pos,
const char *  name 
)

XWMM API:初始化简单内存分配器对象

参数
[in]sa简单内存分配器对象
[in]origin内存区域的首地址
[in]size内存区域的大小
[in]pos内存区域的位置
[in]name分配器的名字
返回
错误码
返回值
XWOK没有错误
-EINVAL内存的大小无效
注解
  • 同步/异步:同步
  • 上下文:中断、中断底半部、线程
  • 重入性:不可重入

< 内存管理对齐的字节数

< 内存管理对齐的字节数

<No error

在文件 sma.c20 行定义.

23{
24 xwer_t rc;
25
26 // cppcheck-suppress [misra-c2012-17.8]
28 if (size < pos) {
29 rc = -EINVAL;
30 } else {
31 rc = XWOK;
32 sa->zone.origin = origin;
33 sa->zone.size = size;
34 sa->pos = pos;
35 sa->name = name;
36 }
37 return rc;
38}
const char * name
Definition sma.h:38