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,8 @@
|
|||
#include "xstring.h"
|
||||
|
||||
typedef struct {
|
||||
my_rwlock_t lock;
|
||||
uint64_t refcount;
|
||||
my_rwlock_t lock;
|
||||
atomic_ulong refcount;
|
||||
} worker_private_t;
|
||||
|
||||
static size_t worker_datasize(va_list ap)
|
||||
|
|
@ -91,9 +92,7 @@ static int worker_reference(meta_obj_t* obj)
|
|||
{
|
||||
worker_private_t* priv = (worker_private_t*)RTTI_OBJ_TO_PRIV(obj);
|
||||
|
||||
my_rwlock_wlock(&(priv->lock));
|
||||
priv->refcount++;
|
||||
my_rwlock_unlock(&(priv->lock));
|
||||
atomic_fetch_add(&(priv->refcount), 1);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
|
@ -104,12 +103,9 @@ static void worker_dereference(meta_obj_t* obj)
|
|||
worker_t* w = RTTI_OBJ_TO_DATA(worker_t, obj);
|
||||
uint64_t count = 0;
|
||||
|
||||
my_rwlock_wlock(&(priv->lock));
|
||||
priv->refcount--;
|
||||
count = priv->refcount;
|
||||
my_rwlock_unlock(&(priv->lock));
|
||||
count = atomic_fetch_sub(&(priv->refcount), 1);
|
||||
|
||||
if (count == 0) {
|
||||
if (count == 1) {
|
||||
destroy_(w, (obj_destroy_fn_t)worker_destroy);
|
||||
}
|
||||
|
||||
|
|
@ -159,12 +155,13 @@ static typeinfo_t worker_type = {
|
|||
.unlock = (unlock_fn_t)worker_unlock } }
|
||||
};
|
||||
|
||||
worker_t* makeWorker(var workermgr, xce_worker_t* w)
|
||||
static worker_t* makeWorker_(var workermgr, xce_worker_t* w)
|
||||
{
|
||||
worker_t* worker = NULL;
|
||||
int rc = 0;
|
||||
|
||||
rc = key_find(workermgr, (void*)w->name, (void**)&worker);
|
||||
|
||||
if ((rc < 0) && (rc != -ENOENT)) {
|
||||
errno = -rc;
|
||||
|
||||
|
|
@ -178,8 +175,8 @@ worker_t* makeWorker(var workermgr, xce_worker_t* w)
|
|||
|
||||
worker = makeInstance(&worker_type, w);
|
||||
if (worker != NULL) {
|
||||
reference(worker);
|
||||
rc = key_add(workermgr, (void*)worker->host.name, (void*)worker);
|
||||
|
||||
if (rc < 0) {
|
||||
destroy(worker);
|
||||
|
||||
|
|
@ -187,5 +184,17 @@ worker_t* makeWorker(var workermgr, xce_worker_t* w)
|
|||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return worker;
|
||||
}
|
||||
|
||||
worker_t* makeWorker(var workermgr, xce_worker_t* w)
|
||||
{
|
||||
worker_t* worker = NULL;
|
||||
|
||||
lock(workermgr, RTTI_LOCK_WRITE);
|
||||
worker = makeWorker_(workermgr, w);
|
||||
unlock(workermgr);
|
||||
|
||||
return worker;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue