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>
#include <xwos/osal/lock/spinlock.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 struct xwos_splk xwos_objtik_lock = { .osspl = { .osplsplk = XWOSPL_SPLK_INITIALIZER, } , }
 
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.c28 行定义.

◆ XWOS_OBJTIK_CHUNK_MSK

#define XWOS_OBJTIK_CHUNK_MSK   (XWOS_OBJTIK_CHUNK - 1U)

在文件 object.c29 行定义.

函数说明

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

71{
72 xwid_t cpu;
73 atomic_xwsq_t * objtik;
74 xwsq_t curr;
75 xwsq_t max;
76 xwsq_t ov;
77 xwer_t rc;
78
80 objtik = &xwos_objtik[cpu];
81 do {
82 curr = xwaop_load(xwsq_t, objtik, xwaop_mo_relaxed);
83 max = (curr & (~XWOS_OBJTIK_CHUNK_MSK)) + XWOS_OBJTIK_CHUNK_MSK;
84 rc = xwaop_tlt_then_add(xwsq_t, objtik, max, 1, NULL, &ov);
85 if (rc < 0) {
86 xwreg_t cpuirq;
87 xwsq_t chunk;
88
90 curr = xwaop_load(xwsq_t, objtik, xwaop_mo_relaxed);
91 if (curr == max) {
92 ov = curr;
94 XWOS_OBJTIK_CHUNK, NULL, &chunk);
95 xwaop_store(xwsq_t, objtik, xwaop_mo_relaxed, chunk);
97 break;
98 } else {
100 }
101 }
102 } while (curr > max);
103 return ov;
104}
signed long xwer_t
Definition type.h:554
#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
unsigned long xwsq_t
Definition type.h:445
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 void xwos_splk_unlock_cpuirqrs(struct xwos_splk *spl, xwreg_t cpuirq)
XWOS API:解锁自旋锁,并恢复本地CPU的中断标志
Definition spinlock.h:220
static void xwos_splk_lock_cpuirqsv(struct xwos_splk *spl, xwreg_t *cpuirq)
XWOS API:上锁自旋锁,保存本地CPU的中断标志并关闭
Definition spinlock.h:188
static xwid_t xwos_skd_get_cpuid_lc(void)
XWOS API:获取当前CPU的ID
Definition skd.h:197
#define XWOS_OBJTIK_CHUNK_MSK
Definition object.c:29
#define XWOS_OBJTIK_CHUNK
Definition object.c:28
static atomic_xwsq_t xwos_objtik[(1U)]
每CPU的对象标签分配器
Definition object.c:44
static struct xwos_splk xwos_objtik_lock
Definition object.c:32
static atomic_xwsq_t xwos_objtik_dispatcher
对象标签分配器,每次分配 XWOS_OBJTIK_CHUNK 个ID给CPU
Definition object.c:38
函数调用图:
这是这个函数的调用关系图:

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

228{
229 const xwsq_t * o;
230 xwobj_d * objd;
231 xwer_t rc;
232
233 o = (const xwsq_t *)ov;
234 objd = arg;
235 if ((XWOS_OBJ_MAGIC != objd->obj->magic) ||
236 (objd->tik != objd->obj->tik)) {
237 rc = -EACCES;
238 } else if (*o < 1) {
239 rc = -EOBJDEAD;
240 } else {
241 rc = XWOK;
242 }
243 return rc;
244}
#define XWOK
No error
Definition errno.h:182
#define EACCES
Permission denied
Definition errno.h:43
#define EOBJDEAD
Object dead
Definition errno.h:208
#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.c247 行定义.

248{
249 xwsq_t * n;
250 const xwsq_t * o;
251
252 XWOS_UNUSED(arg);
253 n = (xwsq_t *)nv;
254 o = (const xwsq_t *)ov;
255 *n = *o - 1;
256}
#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.c168 行定义.

169{
170 const xwsq_t * o;
171 xwobj_d * objd;
172 xwer_t rc;
173
174 o = (const xwsq_t *)ov;
175 objd = arg;
176 if ((XWOS_OBJ_MAGIC != objd->obj->magic) ||
177 (objd->tik != objd->obj->tik)) {
178 rc = -EACCES;
179 } else if (*o < 1) {
180 rc = -EOBJDEAD;
181 } else {
182 rc = XWOK;
183 }
184 return rc;
185}
这是这个函数的调用关系图:

◆ xwos_object_acquire_refaop_op()

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

< 去除未使用变量的警告

在文件 object.c188 行定义.

189{
190 xwsq_t * n;
191 const xwsq_t * o;
192
193 XWOS_UNUSED(arg);
194 n = (xwsq_t *)nv;
195 o = (const xwsq_t *)ov;
196 *n = *o + 1;
197}
这是这个函数的调用关系图:

变量说明

◆ xwos_objtik_lock

struct xwos_splk xwos_objtik_lock = { .osspl = { .osplsplk = XWOSPL_SPLK_INITIALIZER, } , }
static

在文件 object.c32 行定义.

◆ xwos_objtik_dispatcher

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

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

在文件 object.c38 行定义.

◆ xwos_objtik

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

每CPU的对象标签分配器

在文件 object.c44 行定义.