save works
This commit is contained in:
parent
acfbec875b
commit
3f74f14687
38 changed files with 751 additions and 448 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue