XWOS API  4.0
XWOS C/C++ API参考手册
载入中...
搜索中...
未找到
XWOS的对象 的协作图:

结构体

struct  xwos_object
 XWOS对象 更多...
 
struct  xwobj_d
 XWOS对象描述符 更多...
 

宏定义

#define xwos_cast(type, obj)   ((type)(obj))
 将对象强制类型转换
 
#define XWOS_OBJ_MAGIC   0x58574F53U
 
#define XWOBJ_NILD   ((xwobj_d){NULL, 0,})
 空的XWOS对象对象描述符
 

类型定义

typedef xwer_t(* xwobj_gc_f) (struct xwos_object *)
 垃圾回收函数指针类型
 

函数

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对象的垃圾回收函数
 
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对象的引用计数
 

详细描述

宏定义说明

◆ XWOBJ_NILD

#define XWOBJ_NILD   ((xwobj_d){NULL, 0,})

空的XWOS对象对象描述符

在文件 object.h71 行定义.

◆ xwos_cast

#define xwos_cast (   type,
  obj 
)    ((type)(obj))

将对象强制类型转换

参数
[in]type类型
[in]obj对象
注解
  • 类似于C++中的关键字: static_cast<type>(obj)

在文件 object.h33 行定义.

◆ XWOS_OBJ_MAGIC

#define XWOS_OBJ_MAGIC   0x58574F53U

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

在文件 object.h35 行定义.

类型定义说明

◆ xwobj_gc_f

typedef xwer_t(* xwobj_gc_f) (struct xwos_object *)

垃圾回收函数指针类型

在文件 object.h42 行定义.

函数说明

◆ xwos_object_acquire()

xwer_t xwos_object_acquire ( struct xwos_object obj,
xwsq_t  tik 
)

检查对象的标签并增加引用计数

参数
[in]obj对象指针
[in]tik标签
返回
错误码
返回值
XWOK没有错误
-ENILOBJD空的对象描述符
-EOBJDEAD对象无效
-EACCES对象标签检查失败

<Nil object descriptor

在文件 object.c206 行定义.

207{
208 xwobj_d objd = {obj, tik};
209 xwer_t rc;
210
211 if ((NULL == obj) || ((xwsq_t)0 == tik)) {
212 rc = -ENILOBJD;
213 } else {
214 rc = xwaop_tst_then_op(xwsq_t, &obj->refcnt,
217 NULL, NULL);
218 }
219 return rc;
220}
#define ENILOBJD
Nil object descriptor
Definition errno.h:207
signed long xwer_t
Definition type.h:554
#define NULL
Definition type.h:28
unsigned long xwsq_t
Definition type.h:445
#define xwaop_tst_then_op(type, a, tf, tfarg, of, ofarg, nv, ov)
对原子变量进行原子操作:读取-测试-修改-回写
Definition xwaop.h:1328
XWOS对象描述符
Definition object.h:63
atomic_xwsq_t refcnt
Definition object.h:56
static xwer_t xwos_object_acquire_refaop_tst(const void *ov, void *arg)
Definition object.c:164
static void xwos_object_acquire_refaop_op(void *nv, const void *ov, void *arg)
Definition object.c:184
函数调用图:
这是这个函数的调用关系图:

◆ xwos_object_activate()

xwer_t xwos_object_activate ( struct xwos_object obj,
xwobj_gc_f  gcfunc 
)

激活一个XWOS对象(将其引用计数初始化位1)

参数
[in]obj对象指针
[in]gcfunc垃圾回收函数:当对象应用计数为0,调用此函数回收资源
返回
错误码
返回值
XWOK没有错误
-EOBJACTIVE对象已激活

<No error

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

<Object active

在文件 object.c135 行定义.

136{
137 xwer_t rc;
138
139 rc = xwaop_teq_then_add(xwsq_t, &obj->refcnt, 0, 1, NULL, NULL);
140 if (XWOK == rc) {
141 obj->tik = xwos_objtik_get();
142 obj->magic = XWOS_OBJ_MAGIC;
143 obj->gcfunc = gcfunc;
144 } else {
145 rc = -EOBJACTIVE;
146 }
147 return rc;
148}
#define XWOK
No error
Definition errno.h:182
#define EOBJACTIVE
Object active
Definition errno.h:209
#define xwaop_teq_then_add(type, a, t, v, nv, ov)
对原子变量进行原子操作:读取-测试“相等”-相加-回写
Definition xwaop.h:355
#define XWOS_OBJ_MAGIC
Definition object.h:35
xwsq_t magic
Definition object.h:55
xwsq_t tik
Definition object.h:54
xwobj_gc_f gcfunc
Definition object.h:57
static xwsq_t xwos_objtik_get(void)
从对象标签分配器获取一个标签
Definition object.c:66
函数调用图:
这是这个函数的调用关系图:

◆ xwos_object_construct()

void xwos_object_construct ( struct xwos_object obj)

XWOS对象的构造函数

参数
[in]obj对象指针

在文件 object.c107 行定义.

108{
109 obj->refcnt = 0;
110 obj->gcfunc = NULL;
111 obj->tik = 0;
112}
这是这个函数的调用关系图:

◆ xwos_object_destruct()

void xwos_object_destruct ( struct xwos_object obj)

XWOS对象的析构函数

参数
[in]obj对象指针

在文件 object.c119 行定义.

120{
121 obj->gcfunc = NULL;
122 obj->tik = 0;
123 obj->magic = 0;
124}
这是这个函数的调用关系图:

◆ xwos_object_get_refcnt()

xwsq_t xwos_object_get_refcnt ( struct xwos_object obj)

获取XWOS对象的引用计数

参数
[in]obj对象指针
返回
引用计数

在文件 object.c363 行定义.

364{
366}
@ xwaop_mo_relaxed
Definition type.h:628
#define xwaop_load(type, a, memorder)
对原子变量进行原子操作:加载
Definition xwaop.h:45
这是这个函数的调用关系图:

◆ xwos_object_grab()

xwer_t xwos_object_grab ( struct xwos_object obj)

增加对象的引用计数

参数
[in]obj对象指针
返回
错误码
返回值
XWOK没有错误
-EOBJDEAD对象已销毁

<Object dead

在文件 object.c297 行定义.

298{
299 xwer_t rc;
300
301 rc = xwaop_tge_then_add(xwsq_t, &obj->refcnt, 1, 1, NULL, NULL);
302 if (rc < 0) {
303 rc = -EOBJDEAD;
304 }
305 return rc;
306}
#define EOBJDEAD
Object dead
Definition errno.h:208
#define xwaop_tge_then_add(type, a, t, v, nv, ov)
对原子变量进行原子操作:读取-测试“大于等于”-相加-回写
Definition xwaop.h:430
这是这个函数的调用关系图:

◆ xwos_object_put()

xwer_t xwos_object_put ( struct xwos_object obj)

减少对象的引用计数

参数
[in]obj对象指针
返回
错误码
返回值
XWOK没有错误
-EOBJDEAD对象已销毁

<No error

<Object dead

在文件 object.c316 行定义.

317{
318 xwer_t rc;
319 xwsq_t nv;
320
321 rc = xwaop_tgt_then_sub(xwsq_t, &obj->refcnt,
322 0, 1,
323 &nv, NULL);
324 if (XWOK == rc) {
325 if ((xwsq_t)0 == nv) {
326 if (NULL != obj->gcfunc) {
327 rc = obj->gcfunc(obj);
328 }
329 }
330 } else {
331 rc = -EOBJDEAD;
332 }
333 return rc;
334}
#define xwaop_tgt_then_sub(type, a, t, v, nv, ov)
对原子变量进行原子操作:读取-测试“大于”-相减-回写
Definition xwaop.h:673
这是这个函数的调用关系图:

◆ xwos_object_rawput()

xwer_t xwos_object_rawput ( struct xwos_object obj)

减少对象的引用计数,不触发垃圾回收函数

参数
[in]obj对象指针
返回
错误码
返回值
XWOK没有错误
-EOBJDEAD对象已销毁

<Object dead

在文件 object.c344 行定义.

345{
346 xwer_t rc;
347
348 rc = xwaop_tgt_then_sub(xwsq_t, &obj->refcnt,
349 0, 1,
350 NULL, NULL);
351 if (rc < 0) {
352 rc = -EOBJDEAD;
353 }
354 return rc;
355}
这是这个函数的调用关系图:

◆ xwos_object_release()

xwer_t xwos_object_release ( struct xwos_object obj,
xwsq_t  tik 
)

检查对象的标签并减少引用计数

参数
[in]obj对象指针
[in]tik标签
返回
错误码
返回值
XWOK没有错误
-ENILOBJD空的对象描述符
-EOBJDEAD对象无效
-EACCES对象标签检查失败

<Nil object descriptor

<No error

在文件 object.c265 行定义.

266{
267 xwobj_d objd = {obj, tik};
268 xwsq_t nv;
269 xwer_t rc;
270
271 if ((NULL == obj) || ((xwsq_t)0 == tik)) {
272 rc = -ENILOBJD;
273 } else {
274 rc = xwaop_tst_then_op(xwsq_t, &obj->refcnt,
277 &nv, NULL);
278 if (XWOK == rc) {
279 if ((xwsq_t)0 == nv) {
280 if (NULL != obj->gcfunc) {
281 rc = obj->gcfunc(obj);
282 }
283 }
284 }
285 }
286 return rc;
287}
static void xwos_object_release_refaop_op(void *nv, const void *ov, void *arg)
Definition object.c:243
static xwer_t xwos_object_release_refaop_tst(const void *ov, void *arg)
Definition object.c:223
函数调用图:
这是这个函数的调用关系图:

◆ xwos_object_setgc()

void xwos_object_setgc ( struct xwos_object obj,
xwobj_gc_f  gcfunc 
)

设置XWOS对象的垃圾回收函数

参数
[in]obj对象指针
[in]gcfunc垃圾回收函数:当对象应用计数为0,调用此函数回收资源

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

在文件 object.c156 行定义.

157{
158 if (XWOS_OBJ_MAGIC == obj->magic) {
159 obj->gcfunc = gcfunc;
160 }
161}

◆ xwos_objtik_init()

void xwos_objtik_init ( void  )

初始化对象标签分配器

在文件 object.c46 行定义.

47{
48 xwsq_t i;
49
50 xwos_objtik_dispatcher = (CPUCFG_CPU_NUM * XWOS_OBJTIK_CHUNK);
51 for (i = 0; i < CPUCFG_CPU_NUM; i++) {
53 }
54}
#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