XWOS API  4.0
XWOS C/C++ API参考手册
载入中...
搜索中...
未找到
object.c
浏览该文件的文档.
1
13#include <xwos/standard.h>
14#include <xwos/lib/object.h>
15#include <xwos/osal/irq.h>
16#include <xwos/osal/skd.h>
18
19static __xwlib_code
21
22static __xwlib_code
23xwer_t xwos_object_release_refaop_tst(const void * ov, void * arg);
24
25static __xwlib_code
26void xwos_object_release_refaop_op(void * nv, const void * ov, void * arg);
27
28#define XWOS_OBJTIK_CHUNK ((xwsq_t)1 << 20U) /* 1M */
29#define XWOS_OBJTIK_CHUNK_MSK (XWOS_OBJTIK_CHUNK - 1U)
30
31static __xwlib_data
33
37static __xwlib_data
39
43static __xwlib_data
45
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}
59
69static __xwlib_code
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}
105
112{
113 obj->refcnt = 0;
114 obj->gcfunc = NULL;
115 obj->tik = 0;
116}
117
124{
125 obj->gcfunc = NULL;
126 obj->tik = 0;
127 obj->magic = 0;
128}
129
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}
153
160void xwos_object_setgc(struct xwos_object * obj, xwobj_gc_f gcfunc)
161{
162 if (XWOS_OBJ_MAGIC == obj->magic) {
163 obj->gcfunc = gcfunc;
164 }
165}
166
167static __xwlib_code
168xwer_t xwos_object_acquire_refaop_tst(const void * ov, void * arg)
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}
186
187static __xwlib_code
188void xwos_object_acquire_refaop_op(void * nv, const void * ov, void * arg)
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}
198
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}
225
226static __xwlib_code
227xwer_t xwos_object_release_refaop_tst(const void * ov, void * arg)
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}
245
246static __xwlib_code
247void xwos_object_release_refaop_op(void * nv, const void * ov, void * arg)
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}
257
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}
292
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}
311
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}
339
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}
360
368{
370}
#define __xwcc_alignl1cache
Definition compiler.h:123
#define __xwlib_data
Definition compiler.h:207
#define __xwlib_code
Definition compiler.h:199
#define XWOK
No error
Definition errno.h:182
#define ENILOBJD
Nil object descriptor
Definition errno.h:207
#define EACCES
Permission denied
Definition errno.h:43
#define EOBJACTIVE
Object active
Definition errno.h:209
#define EOBJDEAD
Object dead
Definition errno.h:208
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_tst_then_op(type, a, tf, tfarg, of, ofarg, nv, ov)
对原子变量进行原子操作:读取-测试-修改-回写
Definition xwaop.h:1328
#define xwaop_store(type, a, memorder, v)
对原子变量进行原子操作:存储
Definition xwaop.h:56
#define xwaop_tge_then_add(type, a, t, v, nv, ov)
对原子变量进行原子操作:读取-测试“大于等于”-相加-回写
Definition xwaop.h:430
#define xwaop_tgt_then_sub(type, a, t, v, nv, ov)
对原子变量进行原子操作:读取-测试“大于”-相减-回写
Definition xwaop.h:673
#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_teq_then_add(type, a, t, v, nv, ov)
对原子变量进行原子操作:读取-测试“相等”-相加-回写
Definition xwaop.h:355
#define xwaop_add(type, a, v, nv, ov)
对原子变量进行原子操作:读取-相加-回写
Definition xwaop.h:330
void xwos_object_setgc(struct xwos_object *obj, xwobj_gc_f gcfunc)
设置XWOS对象的垃圾回收函数
Definition object.c:160
xwer_t xwos_object_rawput(struct xwos_object *obj)
减少对象的引用计数,不触发垃圾回收函数
Definition object.c:348
xwer_t(* xwobj_gc_f)(struct xwos_object *)
垃圾回收函数指针类型
Definition object.h:42
xwer_t xwos_object_grab(struct xwos_object *obj)
增加对象的引用计数
Definition object.c:301
xwer_t xwos_object_activate(struct xwos_object *obj, xwobj_gc_f gcfunc)
激活一个XWOS对象(将其引用计数初始化位1)
Definition object.c:139
void xwos_object_construct(struct xwos_object *obj)
XWOS对象的构造函数
Definition object.c:111
xwsq_t xwos_object_get_refcnt(struct xwos_object *obj)
获取XWOS对象的引用计数
Definition object.c:367
void xwos_object_destruct(struct xwos_object *obj)
XWOS对象的析构函数
Definition object.c:123
xwer_t xwos_object_release(struct xwos_object *obj, xwsq_t tik)
检查对象的标签并减少引用计数
Definition object.c:269
void xwos_objtik_init(void)
初始化对象标签分配器
Definition object.c:50
#define XWOS_OBJ_MAGIC
Definition object.h:35
xwer_t xwos_object_acquire(struct xwos_object *obj, xwsq_t tik)
检查对象的标签并增加引用计数
Definition object.c:210
xwer_t xwos_object_put(struct xwos_object *obj)
减少对象的引用计数
Definition object.c:320
#define XWOS_SPLK_INITIALIZER
XWOS API:自旋锁的初始值
Definition spinlock.h:76
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_UNUSED(x)
Definition standard.h:66
操作系统抽象层:异常与中断
操作系统抽象层:自旋锁
操作系统抽象层:调度器
XWOS对象描述符
Definition object.h:63
struct xwos_object * obj
Definition object.h:64
xwsq_t tik
Definition object.h:65
XWOS对象
Definition object.h:53
atomic_xwsq_t refcnt
Definition object.h:56
xwsq_t magic
Definition object.h:55
xwsq_t tik
Definition object.h:54
xwobj_gc_f gcfunc
Definition object.h:57
XWOS API:自旋锁
Definition spinlock.h:69
#define XWOS_OBJTIK_CHUNK_MSK
Definition object.c:29
static xwsq_t xwos_objtik_get(void)
从对象标签分配器获取一个标签
Definition object.c:70
#define XWOS_OBJTIK_CHUNK
Definition object.c:28
static xwer_t xwos_object_acquire_refaop_tst(const void *ov, void *arg)
Definition object.c:168
static atomic_xwsq_t xwos_objtik[(1U)]
每CPU的对象标签分配器
Definition object.c:44
static void xwos_object_release_refaop_op(void *nv, const void *ov, void *arg)
Definition object.c:247
static struct xwos_splk xwos_objtik_lock
Definition object.c:32
static xwer_t xwos_object_release_refaop_tst(const void *ov, void *arg)
Definition object.c:227
static void xwos_object_acquire_refaop_op(void *nv, const void *ov, void *arg)
Definition object.c:188
static atomic_xwsq_t xwos_objtik_dispatcher
对象标签分配器,每次分配 XWOS_OBJTIK_CHUNK 个ID给CPU
Definition object.c:38
XWOS通用库:XWOS的对象
XWOS的标准头文件