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对象的引用计数
 

详细描述

宏定义说明

◆ 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_NILD

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

空的XWOS对象对象描述符

在文件 object.h71 行定义.

类型定义说明

◆ xwobj_gc_f

typedef xwer_t(* xwobj_gc_f) (struct xwos_object *)

垃圾回收函数指针类型

在文件 object.h42 行定义.

函数说明

◆ xwos_objtik_init()

void xwos_objtik_init ( void  )

初始化对象标签分配器

在文件 object.c50 行定义.

51{
52 xwsq_t i;
53
54 xwos_objtik_dispatcher = (CPUCFG_CPU_NUM * XWOS_OBJTIK_CHUNK);
55 for (i = 0; i < CPUCFG_CPU_NUM; i++) {
57 }
58}
unsigned long xwsq_t
Definition type.h:445
#define XWOS_OBJTIK_CHUNK
Definition object.c:28
static atomic_xwsq_t xwos_objtik[(1U)]
每CPU的对象标签分配器
Definition object.c:44
static atomic_xwsq_t xwos_objtik_dispatcher
对象标签分配器,每次分配 XWOS_OBJTIK_CHUNK 个ID给CPU
Definition object.c:38

◆ xwos_object_construct()

void xwos_object_construct ( struct xwos_object obj)

XWOS对象的构造函数

参数
[in]obj对象指针

在文件 object.c111 行定义.

112{
113 obj->refcnt = 0;
114 obj->gcfunc = NULL;
115 obj->tik = 0;
116}
#define NULL
Definition type.h:28
atomic_xwsq_t refcnt
Definition object.h:56
xwsq_t tik
Definition object.h:54
xwobj_gc_f gcfunc
Definition object.h:57
这是这个函数的调用关系图:

◆ xwos_object_destruct()

void xwos_object_destruct ( struct xwos_object obj)

XWOS对象的析构函数

参数
[in]obj对象指针

在文件 object.c123 行定义.

124{
125 obj->gcfunc = NULL;
126 obj->tik = 0;
127 obj->magic = 0;
128}
xwsq_t magic
Definition object.h:55
这是这个函数的调用关系图:

◆ 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.c139 行定义.

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

◆ xwos_object_setgc()

void xwos_object_setgc ( struct xwos_object obj,
xwobj_gc_f  gcfunc 
)

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

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

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

在文件 object.c160 行定义.

161{
162 if (XWOS_OBJ_MAGIC == obj->magic) {
163 obj->gcfunc = gcfunc;
164 }
165}

◆ 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.c210 行定义.

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

◆ 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.c269 行定义.

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

◆ xwos_object_grab()

xwer_t xwos_object_grab ( struct xwos_object obj)

增加对象的引用计数

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

<Object dead

在文件 object.c301 行定义.

302{
303 xwer_t rc;
304
305 rc = xwaop_tge_then_add(xwsq_t, &obj->refcnt, 1, 1, NULL, NULL);
306 if (rc < 0) {
307 rc = -EOBJDEAD;
308 }
309 return rc;
310}
#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.c320 行定义.

321{
322 xwer_t rc;
323 xwsq_t nv;
324
325 rc = xwaop_tgt_then_sub(xwsq_t, &obj->refcnt,
326 0, 1,
327 &nv, NULL);
328 if (XWOK == rc) {
329 if ((xwsq_t)0 == nv) {
330 if (NULL != obj->gcfunc) {
331 rc = obj->gcfunc(obj);
332 }
333 }
334 } else {
335 rc = -EOBJDEAD;
336 }
337 return rc;
338}
#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.c348 行定义.

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

◆ xwos_object_get_refcnt()

xwsq_t xwos_object_get_refcnt ( struct xwos_object obj)

获取XWOS对象的引用计数

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

在文件 object.c367 行定义.

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