save works

This commit is contained in:
Rongsong Shen 2026-03-04 18:18:53 +08:00
parent acfbec875b
commit 3f74f14687
38 changed files with 751 additions and 448 deletions

View file

@ -1,6 +1,7 @@
#include <errno.h>
#include <rtti.h>
#include <stdarg.h>
#include <stdatomic.h>
#include <stdlib.h>
#include <string.h>
@ -10,8 +11,7 @@
#include "xstring.h"
typedef struct {
mylock_t lock;
uint64_t refcount;
atomic_ulong refcount;
} resobj_private_t;
static size_t resobj_datasize(va_list ap)
@ -52,7 +52,6 @@ static int resobj_init(meta_obj_t* obj, va_list ap)
dst->hbased_defined = NULL;
#endif
mylock_init(&(priv->lock));
priv->refcount = 1;
return 1;
@ -66,7 +65,6 @@ static void resobj_destroy(meta_obj_t* obj)
dereference(r->name);
dereference(r->desc);
mylock_fini(&(priv->lock));
memset(priv, 0x0, sizeof(*priv));
return;
@ -76,9 +74,7 @@ static int resobj_reference(meta_obj_t* obj)
{
resobj_private_t* priv = (resobj_private_t*)RTTI_OBJ_TO_PRIV(obj);
mylock_lock(&(priv->lock));
priv->refcount++;
mylock_unlock(&(priv->lock));
atomic_fetch_add(&(priv->refcount), 1);
return 1;
}
@ -89,12 +85,9 @@ static void resobj_dereference(meta_obj_t* obj)
xce_resource_t* w = RTTI_OBJ_TO_DATA(xce_resource_t, obj);
uint64_t count = 0;
mylock_lock(&(priv->lock));
priv->refcount--;
count = priv->refcount;
mylock_unlock(&(priv->lock));
count = atomic_fetch_sub(&(priv->refcount), 1);
if (count == 0) {
if (count == 1) {
destroy_(w, (obj_destroy_fn_t)resobj_destroy);
}
@ -112,12 +105,13 @@ static typeinfo_t resobj_type
.reference = (reference_fn_t)resobj_reference,
.dereference = (dereference_fn_t)resobj_dereference } } };
xce_resource_t* makeResource(var resmgr, xce_resource_t* r)
static xce_resource_t* makeResource_(var resmgr, xce_resource_t* r)
{
xce_resource_t* resobj = NULL;
int rc;
rc = key_find(resmgr, (void*)r->name, (void**)&resobj);
if ((rc < 0) && (rc != -ENOENT)) {
errno = -rc;
@ -131,8 +125,8 @@ xce_resource_t* makeResource(var resmgr, xce_resource_t* r)
resobj = makeInstance(&resobj_type, r);
if (resobj != NULL) {
reference(resobj);
rc = key_add(resmgr, (void*)resobj->name, (void*)resobj);
if (rc < 0) {
destroy(resobj);
@ -142,3 +136,14 @@ xce_resource_t* makeResource(var resmgr, xce_resource_t* r)
}
return resobj;
}
xce_resource_t* makeResource(var resmgr, xce_resource_t* r)
{
xce_resource_t* r1 = NULL;
lock(resmgr, RTTI_LOCK_WRITE);
r1 = makeResource_(resmgr, r);
unlock(resmgr);
return r1;
}