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>
|
||||
|
||||
|
|
@ -103,8 +104,7 @@ static void jobsub_table_fini()
|
|||
}
|
||||
|
||||
typedef struct {
|
||||
mylock_t lock;
|
||||
uint64_t refcount;
|
||||
atomic_ulong refcount;
|
||||
} job_submit_private_t;
|
||||
|
||||
static size_t jobsub_datasize(va_list ap)
|
||||
|
|
@ -154,7 +154,6 @@ static int jobsub_init(meta_obj_t* obj, va_list ap)
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
mylock_init(&(priv->lock));
|
||||
priv->refcount = 1;
|
||||
|
||||
return 1;
|
||||
|
|
@ -176,7 +175,6 @@ static void jobsub_destroy(meta_obj_t* obj)
|
|||
dereference(jobsub->start_info);
|
||||
}
|
||||
|
||||
mylock_fini(&(priv->lock));
|
||||
memset(priv, 0x0, sizeof(*priv));
|
||||
}
|
||||
|
||||
|
|
@ -184,9 +182,7 @@ static int jobsub_reference(meta_obj_t* obj)
|
|||
{
|
||||
job_submit_private_t* priv = (job_submit_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;
|
||||
}
|
||||
|
|
@ -197,12 +193,9 @@ static void jobsub_dereference(meta_obj_t* obj)
|
|||
job_submit_data_t* data = RTTI_OBJ_TO_DATA(job_submit_data_t, obj);
|
||||
uint64_t count;
|
||||
|
||||
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) {
|
||||
mylock_lock(&(jobsub_table.lock));
|
||||
key_del(jobsub_table.sub_table, data);
|
||||
mylock_unlock(&(jobsub_table.lock));
|
||||
|
|
@ -268,8 +261,7 @@ job_submit_data_t* makeJobsub(job_submit_data_t* subdata)
|
|||
}
|
||||
|
||||
typedef struct {
|
||||
mylock_t lock;
|
||||
uint64_t refcount;
|
||||
atomic_ulong refcount;
|
||||
} startinfo_private_t;
|
||||
|
||||
static void startinfo_destroy(meta_obj_t* obj)
|
||||
|
|
@ -305,7 +297,6 @@ static void startinfo_destroy(meta_obj_t* obj)
|
|||
dereference(startinfo->job_post_exec);
|
||||
}
|
||||
|
||||
mylock_fini(&(priv->lock));
|
||||
memset(priv, 0x0, sizeof(*priv));
|
||||
return;
|
||||
}
|
||||
|
|
@ -327,7 +318,6 @@ static int startinfo_init(meta_obj_t* obj, va_list ap)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
mylock_init(&(priv->lock));
|
||||
priv->refcount = 1;
|
||||
|
||||
dst->exechome = makeString(src->exechome);
|
||||
|
|
@ -371,9 +361,7 @@ static int startinfo_reference(meta_obj_t* obj)
|
|||
{
|
||||
startinfo_private_t* priv = (startinfo_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;
|
||||
}
|
||||
|
|
@ -384,16 +372,14 @@ static void startinfo_dereference(meta_obj_t* obj)
|
|||
startinfo_private_t* priv = (startinfo_private_t*)RTTI_OBJ_TO_PRIV(obj);
|
||||
uint64_t count;
|
||||
|
||||
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) {
|
||||
mylock_lock(&(startinfo_table.lock));
|
||||
key_del(startinfo_table.startinfo_table, startinfo);
|
||||
mylock_unlock(&(startinfo_table.lock));
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -531,8 +517,8 @@ static void startinfo_table_fini()
|
|||
}
|
||||
|
||||
typedef struct {
|
||||
my_rwlock_t lock;
|
||||
uint64_t refcount;
|
||||
my_rwlock_t lock;
|
||||
atomic_ulong refcount;
|
||||
} job_private_t;
|
||||
|
||||
static size_t job_datasize(va_list ap)
|
||||
|
|
@ -606,9 +592,7 @@ static int job_reference(meta_obj_t* obj)
|
|||
{
|
||||
job_private_t* priv = (job_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;
|
||||
}
|
||||
|
|
@ -619,12 +603,9 @@ static void job_dereference(meta_obj_t* obj)
|
|||
job_t* j = RTTI_OBJ_TO_DATA(job_t, obj);
|
||||
uint64_t count;
|
||||
|
||||
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_(j, (obj_destroy_fn_t)job_destroy);
|
||||
}
|
||||
|
||||
|
|
@ -674,12 +655,13 @@ static typeinfo_t job_type = {
|
|||
.unlock = (unlock_fn_t)job_unlock } }
|
||||
};
|
||||
|
||||
job_t* makeJob(var jobmgr, xce_job_t* j)
|
||||
static job_t* makeJob_(var jobmgr, xce_job_t* j)
|
||||
{
|
||||
job_t* job = NULL;
|
||||
int rc = 0;
|
||||
int rc = 0;
|
||||
|
||||
rc = key_find(jobmgr, (void*)j->jobid, (void**)&job);
|
||||
|
||||
rc = key_find(jobmgr, (void *)j->jobid, (void **)&job);
|
||||
if ((rc < 0) && (rc != -ENOENT)) {
|
||||
errno = -rc;
|
||||
return NULL;
|
||||
|
|
@ -689,10 +671,11 @@ job_t* makeJob(var jobmgr, xce_job_t* j)
|
|||
errno = EEXIST;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
job = makeInstance(&job_type, j);
|
||||
if (job != NULL) {
|
||||
rc = key_add(jobmgr, (void *)job->job.jobid, (void **)job);
|
||||
rc = key_add(jobmgr, (void*)job->job.jobid, (void**)job);
|
||||
|
||||
if (rc < 0) {
|
||||
destroy(job);
|
||||
|
||||
|
|
@ -700,6 +683,22 @@ job_t* makeJob(var jobmgr, xce_job_t* j)
|
|||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return job;
|
||||
}
|
||||
|
||||
job_t* makeJob(var jobmgr, xce_job_t* j)
|
||||
{
|
||||
job_t* job = NULL;
|
||||
int rc = 0;
|
||||
|
||||
lock(jobmgr, RTTI_LOCK_WRITE);
|
||||
job = makeJob_(jobmgr, j);
|
||||
rc = errno;
|
||||
unlock(jobmgr);
|
||||
|
||||
errno = rc;
|
||||
|
||||
return job;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue