XWOS API  4.0
XWOS C/C++ API参考手册
载入中...
搜索中...
未找到
objcache.c 文件参考

XWOS内存管理:内存池:对象缓存 更多...

objcache.c 的引用(Include)关系图:

浏览源代码.

宏定义

#define xwmm_mempoollogf(lv, thd, fmt, ...)
 

函数

static void xwmm_mempool_objcache_page_init (struct xwmm_mempool_objcache *oc, struct xwmm_mempool_page *pg)
 初始化新页
 
static xwsz_t xwmm_mempool_objcache_free_idle_page (struct xwmm_mempool_objcache *oc, xwsz_t nr)
 释放空闲页
 
static void xwmm_mempool_objcache_page_put (struct xwmm_mempool_objcache *oc, struct xwmm_mempool_page *pg)
 减少页的引用计数
 
static xwer_t xwmm_mempool_objcache_page_get (struct xwmm_mempool_objcache *oc, struct xwmm_mempool_page **pgbuf)
 获取一页,准备从页内存中分配对象
 
static xwer_t xwmm_mempool_objcache_i_a_malloc (void *this, xwsz_t size, void **membuf)
 i_allocator接口函数:申请内存
 
static xwer_t xwmm_mempool_objcache_i_a_free (void *this, void *mem)
 i_allocator接口函数:释放内存
 
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:获取对象缓存的容量
 

详细描述

XWOS内存管理:内存池:对象缓存

作者

在文件 objcache.c 中定义.

宏定义说明

◆ xwmm_mempoollogf

#define xwmm_mempoollogf (   lv,
  thd,
  fmt,
  ... 
)

< 调试日志开关

在文件 objcache.c28 行定义.

函数说明

◆ xwmm_mempool_objcache_free_idle_page()

static xwsz_t xwmm_mempool_objcache_free_idle_page ( struct xwmm_mempool_objcache oc,
xwsz_t  nr 
)
static

释放空闲页

参数
[in]oc对象缓存的指针
[in]nr期望释放的数量
返回
实际释放的数量

在文件 objcache.c160 行定义.

162{
163 struct xwmm_mempool_page * pg;
164 xwreg_t flag;
165 xwsz_t real;
166
167 real = 0;
168 while (real < nr) {
172 break;
173 }
175 struct xwmm_mempool_page,
176 attr.objcache.node);
179 // cppcheck-suppress [misra-c2012-17.7]
180 xwmm_mempool_page_free(oc->pa, pg);
183 real++;
184 }
185 return real;
186}
xwer_t xwmm_mempool_page_free(struct xwmm_mempool_page_allocator *pa, struct xwmm_mempool_page *pg)
XWMM API:释放一页内存
Definition page.c:194
static bool xwlib_bclst_tst_empty(const struct xwlib_bclst_node *h)
测试链表是否为空。
Definition bclst.h:253
static void xwlib_bclst_del_init(struct xwlib_bclst_node *node)
删除一个节点,并重新初始化它
Definition bclst.h:391
#define xwlib_bclst_last_entry(head, type, member)
获得包含链表最后一个节点的外层结构体的指针。
Definition bclst.h:73
#define NULL
Definition type.h:28
unsigned long xwsz_t
Definition type.h:339
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
struct xwmm_mempool_page_allocator * pa
Definition objcache.h:36
struct xwlib_bclst_node idle
Definition objcache.h:57
struct xwos_sqlk lock
Definition objcache.h:58
atomic_xwsz_t idleness
Definition objcache.h:51
struct xwmm_mempool_objcache::@0 page_list
atomic_xwsz_t capacity
Definition objcache.h:50
内存页
Definition page.h:37
struct xwlib_bclst_node node
Definition page.h:51
union xwmm_mempool_page::@1 attr
struct xwmm_mempool_page::@1::@4 objcache
函数调用图:
这是这个函数的调用关系图:

◆ xwmm_mempool_objcache_i_a_free()

static xwer_t xwmm_mempool_objcache_i_a_free ( void *  this,
void *  mem 
)
static

i_allocator接口函数:释放内存

参数
[in]thisthis指针(页分配器)
[in]mem内存的首地址
返回
错误码
返回值
XWOK没有错误
-ENOMEM内存不足

在文件 objcache.c430 行定义.

431{
432 struct xwmm_mempool_objcache * oc;
433 xwer_t rc;
434
435 oc = this;
436 rc = xwmm_mempool_objcache_free(oc, mem);
437 return rc;
438}
xwer_t xwmm_mempool_objcache_free(struct xwmm_mempool_objcache *oc, void *obj)
XWMM API:释放对象到对象缓存中
Definition objcache.c:299
signed long xwer_t
Definition type.h:554
对象缓存
Definition objcache.h:34
函数调用图:
这是这个函数的调用关系图:

◆ xwmm_mempool_objcache_i_a_malloc()

static xwer_t xwmm_mempool_objcache_i_a_malloc ( void *  this,
xwsz_t  size,
void **  membuf 
)
static

i_allocator接口函数:申请内存

参数
[in]thisthis指针(页分配器)
[in]size申请的大小
[out]membuf指向缓冲区的指针,通过此缓冲区返回申请到的内存的首地址
返回
错误码
返回值
XWOK没有错误
-ENOMEM内存不足

<Size error

<No error

在文件 objcache.c400 行定义.

401{
402 struct xwmm_mempool_objcache * oc;
403 xwer_t rc;
404
405 oc = this;
406 if (size > oc->objsize) {
407 rc = -ESIZE;
408 goto err_size;
409 }
410 rc = xwmm_mempool_objcache_alloc(oc, membuf);
411 if (rc < 0) {
412 goto err_alloc;
413 }
414 return XWOK;
415
416err_alloc:
417err_size:
418 return rc;
419}
xwer_t xwmm_mempool_objcache_alloc(struct xwmm_mempool_objcache *oc, void **objbuf)
XWMM API:从对象缓存中申请一个对象
Definition objcache.c:263
#define XWOK
No error
Definition errno.h:182
#define ESIZE
Size error
Definition errno.h:199
函数调用图:
这是这个函数的调用关系图:

◆ xwmm_mempool_objcache_page_get()

static xwer_t xwmm_mempool_objcache_page_get ( struct xwmm_mempool_objcache oc,
struct xwmm_mempool_page **  pgbuf 
)
static

获取一页,准备从页内存中分配对象

参数
[in]oc对象缓存的指针
[out]pgbuf指向缓冲区的指针,通过此缓冲区返回页控制块的指针
返回
错误码
返回值
XWOK没有错误
-ENOMEM内存不足

<No error

在文件 objcache.c225 行定义.

227{
228 struct xwmm_mempool_page * pg;
229 xwreg_t flag;
230 xwer_t rc;
231
235 struct xwmm_mempool_page,
236 attr.objcache.node);
239 } else if (!xwlib_bclst_tst_empty(&oc->page_list.idle)) {
241 struct xwmm_mempool_page,
242 attr.objcache.node);
245 } else {
247 rc = xwmm_mempool_page_allocate(oc->pa, oc->pg_order, &pg);
248 if (rc < 0) {
249 goto err_pg_alloc;
250 }
254 }
255 *pgbuf = pg;
256 return XWOK;
257
258err_pg_alloc:
259 return rc;
260}
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 xwlib_bclst_first_entry(head, type, member)
获得包含链表第一个节点的外层结构体的指针。
Definition bclst.h:63
#define xwaop_add(type, a, v, nv, ov)
对原子变量进行原子操作:读取-相加-回写
Definition xwaop.h:330
static void xwmm_mempool_objcache_page_init(struct xwmm_mempool_objcache *oc, struct xwmm_mempool_page *pg)
初始化新页
Definition objcache.c:115
struct xwlib_bclst_node available
Definition objcache.h:56
函数调用图:
这是这个函数的调用关系图:

◆ xwmm_mempool_objcache_page_init()

static void xwmm_mempool_objcache_page_init ( struct xwmm_mempool_objcache oc,
struct xwmm_mempool_page pg 
)
static

初始化新页

参数
[in]oc对象缓存的指针
[in]pg页控制块的指针

在文件 objcache.c115 行定义.

117{
118 xwsz_t i;
119 xwsz_t loop;
120 xwptr_t curr;
121 xwptr_t next;
122
124 pg->attr.objcache.refcnt = 0;
125 pg->data.value = oc->objsize;
126
127 /* 构造所有对象 */
128 if (NULL != oc->ctor) {
129 curr = pg->mapping;
130 next = curr;
131 loop = oc->pg_objnr;
132 for (i = 0; i < loop; i++) {
133 next += oc->objsize;
134 oc->ctor((void *)curr);
135 curr = next;
136 }
137 }
138
139 /* 初始化无锁队列 */
141 curr = pg->mapping;
142 next = curr;
143 loop = oc->pg_objnr;
144 for (i = 0; i < loop; i++) {
145 next += oc->objsize;
148 (atomic_xwlfq_t *)curr);
149 curr = next;
150 }
151}
static void xwlib_bclst_init_node(struct xwlib_bclst_node *n)
初始化一个链表节点。
Definition bclst.h:240
static void xwlib_lfq_push(atomic_xwlfq_t *h, atomic_xwlfq_t *n)
将一个节点推入无锁队列(栈式队列)
Definition lfq.h:42
static void xwlib_lfq_init(atomic_xwlfq_t *n)
初始化无锁队列节点
Definition lfq.h:31
__xwcc_atomic xwlfq_t atomic_xwlfq_t
Definition type.h:594
unsigned long xwptr_t
Definition type.h:375
xwsq_t value
Definition page.h:61
xwptr_t mapping
Definition page.h:40
union xwmm_mempool_page::@2 data
xwsq_t refcnt
Definition page.h:53
atomic_xwlfq_t objhead
Definition page.h:52
函数调用图:
这是这个函数的调用关系图:

◆ xwmm_mempool_objcache_page_put()

static void xwmm_mempool_objcache_page_put ( struct xwmm_mempool_objcache oc,
struct xwmm_mempool_page pg 
)
static

减少页的引用计数

参数
[in]oc对象缓存的指针
[in]pg页控制块的指针
返回
错误码
返回值
XWOK没有错误
<0失败

< 报告BUG

< 当条件x成立时报告BUG

在文件 objcache.c197 行定义.

199{
200 xwreg_t flag;
201
204 pg->attr.objcache.refcnt--;
206 if ((xwsq_t)0 == pg->attr.objcache.refcnt) {
208 &pg->attr.objcache.node);
209 } else {
211 &pg->attr.objcache.node);
212 }
214}
static void xwlib_bclst_add_head(struct xwlib_bclst_node *head, struct xwlib_bclst_node *newn)
将一个节点加入链表头部(链表头的后面)
Definition bclst.h:345
unsigned long xwsq_t
Definition type.h:445
#define XWOS_BUG_ON(x)
Definition standard.h:57
函数调用图:
这是这个函数的调用关系图: