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>
@ -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;
}