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

XWOS通用库:XWOS的对象 更多...

#include <xwos/standard.h>
#include <xwos/lib/object.h>
#include <xwos/osal/irq.h>
#include <xwos/osal/skd.h>
object.c 的引用(Include)关系图:

浏览源代码.

宏定义

#define XWOS_OBJTIK_CHUNK   ((xwsq_t)1 << 20U) /* 1M */
 
#define XWOS_OBJTIK_CHUNK_MSK   (XWOS_OBJTIK_CHUNK - 1U)
 

函数

static xwsq_t xwos_objtik_get (void)
 从对象标签分配器获取一个标签
 
static xwer_t xwos_object_release_refaop_tst (const void *ov, void *arg)
 
static void xwos_object_release_refaop_op (void *nv, const void *ov, void *arg)
 
void xwos_objtik_init (void)
 初始化对象标签分配器
 
void xwos_object_construct (struct xwos_object *obj)
 XWOS对象的构造函数
 
void xwos_object_destruct (struct xwos_object *obj)
 XWOS对象的析构函数
 
xwer_t xwos_object_activate (struct xwos_object *obj, xwobj_gc_f gcfunc)
 激活一个XWOS对象(将其引用计数初始化位1)
 
void xwos_object_setgc (struct xwos_object *obj, xwobj_gc_f gcfunc)
 设置XWOS对象的垃圾回收函数
 
static xwer_t xwos_object_acquire_refaop_tst (const void *ov, void *arg)
 
static void xwos_object_acquire_refaop_op (void *nv, const void *ov, void *arg)
 
xwer_t xwos_object_acquire (struct xwos_object *obj, xwsq_t tik)
 检查对象的标签并增加引用计数
 
xwer_t xwos_object_release (struct xwos_object *obj, xwsq_t tik)
 检查对象的标签并减少引用计数
 
xwer_t xwos_object_grab (struct xwos_object *obj)
 增加对象的引用计数
 
xwer_t xwos_object_put (struct xwos_object *obj)
 减少对象的引用计数
 
xwer_t xwos_object_rawput (struct xwos_object *obj)
 减少对象的引用计数,不触发垃圾回收函数
 
xwsq_t xwos_object_get_refcnt (struct xwos_object *obj)
 获取XWOS对象的引用计数
 

变量

static atomic_xwsq_t xwos_objtik_dispatcher = ( (1U) * ((xwsq_t)1 << 20U) )
 对象标签分配器,每次分配 XWOS_OBJTIK_CHUNK 个ID给CPU
 
static atomic_xwsq_t xwos_objtik [(1U)] = {0}
 每CPU的对象标签分配器
 

详细描述

XWOS通用库:XWOS的对象

作者

在文件 object.c 中定义.

宏定义说明

◆ XWOS_OBJTIK_CHUNK

#define XWOS_OBJTIK_CHUNK   ((xwsq_t)1 << 20U) /* 1M */

在文件 object.c27 行定义.

◆ XWOS_OBJTIK_CHUNK_MSK

#define XWOS_OBJTIK_CHUNK_MSK   (XWOS_OBJTIK_CHUNK - 1U)

在文件 object.c28 行定义.

函数说明

◆ xwos_object_acquire_refaop_op()

static void xwos_object_acquire_refaop_op ( void *  nv,
const void *  ov,
void *  arg 
)
static

< 去除未使用变量的警告

在文件 object.c184 行定义.

185{
186 xwsq_t * n;
187 const xwsq_t * o;
188
189 XWOS_UNUSED(arg);
190 n = (xwsq_t *)nv;
191 o = (const xwsq_t *)ov;
192 *n = *o + 1;
193}
unsigned long xwsq_t
Definition type.h:445
#define XWOS_UNUSED(x)
Definition standard.h:66
这是这个函数的调用关系图:

◆ xwos_object_acquire_refaop_tst()

static xwer_t xwos_object_acquire_refaop_tst ( const void *  ov,
void *  arg 
)
static

< 所有XWOS的对象都有相同的幻数

<Object dead

<No error

在文件 object.c164 行定义.

165{
166 const xwsq_t * o;
167 xwobj_d * objd;
168 xwer_t rc;
169
170 o = (const xwsq_t *)ov;
171 objd = arg;
172 if ((XWOS_OBJ_MAGIC != objd->obj->magic) ||
173 (objd->tik != objd->obj->tik)) {
174 rc = -EACCES;
175 } else if (*o < 1) {
176 rc = -EOBJDEAD;
177 } else {
178 rc = XWOK;
179 }
180 return rc;
181}
#define XWOK
No error
Definition errno.h:182
#define EACCES
Permission denied
Definition errno.h:43
#define EOBJDEAD
Object dead
Definition errno.h:208
signed long xwer_t
Definition type.h:554
#define XWOS_OBJ_MAGIC
Definition object.h:35
XWOS对象描述符
Definition object.h:63
struct xwos_object * obj
Definition object.h:64
xwsq_t tik
Definition object.h:65
xwsq_t magic
Definition object.h:55
xwsq_t tik
Definition object.h:54
这是这个函数的调用关系图:

◆ xwos_object_release_refaop_op()

static void xwos_object_release_refaop_op ( void *  nv,
const void *  ov,
void *  arg 
)
static

< 去除未使用变量的警告

在文件 object.c243 行定义.

244{
245 xwsq_t * n;
246 const xwsq_t * o;
247
248 XWOS_UNUSED(arg);
249 n = (xwsq_t *)nv;
250 o = (const xwsq_t *)ov;
251 *n = *o - 1;
252}
这是这个函数的调用关系图:

◆ xwos_object_release_refaop_tst()

static xwer_t xwos_object_release_refaop_tst ( const void *  ov,
void *  arg 
)
static

< 所有XWOS的对象都有相同的幻数

<Object dead

<No error

在文件 object.c223 行定义.

224{
225 const xwsq_t * o;
226 xwobj_d * objd;
227 xwer_t rc;
228
229 o = (const xwsq_t *)ov;
230 objd = arg;
231 if ((XWOS_OBJ_MAGIC != objd->obj->magic) ||
232 (objd->tik != objd->obj->tik)) {
233 rc = -EACCES;
234 } else if (*o < 1) {
235 rc = -EOBJDEAD;
236 } else {
237 rc = XWOK;
238 }
239 return rc;
240}
这是这个函数的调用关系图:

◆ xwos_objtik_get()

static xwsq_t xwos_objtik_get ( void  )
static

从对象标签分配器获取一个标签

返回
标签

为了避免频繁地访问多CPU共享原子变量 xwos_objtik_dispatcher ,每次获取标签 都是从当前CPU的私有变量 xwos_objtik[cpu] 中分配的,只有当 xwos_objtik[cpu] 的 分配额达到最大额度 XWOS_OBJTIK_CHUNK 时,才会在临界区访问 xwos_objtik_dispatcher 预先分配数量为 XWOS_OBJTIK_CHUNK 的标签。

在文件 object.c66 行定义.

67{
68 xwid_t cpu;
69 atomic_xwsq_t * objtik;
70 xwsq_t curr;
71 xwsq_t max;
72 xwsq_t ov;
73 xwer_t rc;
74
76 objtik = &xwos_objtik[cpu];
77 do {
78 curr = xwaop_load(xwsq_t, objtik, xwaop_mo_relaxed);
79 max = (curr & (~XWOS_OBJTIK_CHUNK_MSK)) + XWOS_OBJTIK_CHUNK_MSK;
80 rc = xwaop_tlt_then_add(xwsq_t, objtik, max, 1, NULL, &ov);
81 if (rc < 0) {
82 xwreg_t cpuirq;
83 xwsq_t chunk;
84
85 xwos_cpuirq_save_lc(&cpuirq);
86 curr = xwaop_load(xwsq_t, objtik, xwaop_mo_relaxed);
87 if (curr == max) {
88 ov = curr;
90 XWOS_OBJTIK_CHUNK, NULL, &chunk);
91 xwaop_store(xwsq_t, objtik, xwaop_mo_relaxed, chunk);
93 break;
94 } else {
96 }
97 }
98 } while (curr > max);
99 return ov;
100}
static void xwos_cpuirq_save_lc(xwreg_t *cpuirq)
XWOS API:保存然后关闭本地CPU的中断开关
Definition irq.h:220
static void xwos_cpuirq_restore_lc(xwreg_t cpuirq)
XWOS API:恢复本地CPU的中断开关
Definition irq.h:206
#define NULL
Definition type.h:28
unsigned long xwid_t
Definition type.h:481
__xwcc_atomic xwsq_t atomic_xwsq_t
Definition type.h:448
xwptr_t xwreg_t
Definition type.h:409
@ xwaop_mo_relaxed
Definition type.h:628
#define xwaop_store(type, a, memorder, v)
对原子变量进行原子操作:存储
Definition xwaop.h:56
#define xwaop_load(type, a, memorder)
对原子变量进行原子操作:加载
Definition xwaop.h:45
#define xwaop_tlt_then_add(type, a, t, v, nv, ov)
对原子变量进行原子操作:读取-测试“小于”-相加-回写
Definition xwaop.h:455
#define xwaop_add(type, a, v, nv, ov)
对原子变量进行原子操作:读取-相加-回写
Definition xwaop.h:330
static xwid_t xwos_skd_get_cpuid_lc(void)
XWOS API:获取当前CPU的ID
Definition skd.h:190
#define XWOS_OBJTIK_CHUNK_MSK
Definition object.c:28
#define XWOS_OBJTIK_CHUNK
Definition object.c:27
static atomic_xwsq_t xwos_objtik[(1U)]
每CPU的对象标签分配器
Definition object.c:40
static atomic_xwsq_t xwos_objtik_dispatcher
对象标签分配器,每次分配 XWOS_OBJTIK_CHUNK 个ID给CPU
Definition object.c:34
函数调用图:
这是这个函数的调用关系图:

变量说明

◆ xwos_objtik

atomic_xwsq_t xwos_objtik[(1U)] = {0}
static

每CPU的对象标签分配器

在文件 object.c40 行定义.

◆ xwos_objtik_dispatcher

atomic_xwsq_t xwos_objtik_dispatcher = ( (1U) * ((xwsq_t)1 << 20U) )
static

对象标签分配器,每次分配 XWOS_OBJTIK_CHUNK 个ID给CPU

在文件 object.c34 行定义.