myxce/src/lib/preason.c
2026-01-12 15:27:54 +08:00

177 lines
4.1 KiB
C

#include <errno.h>
#include <stdlib.h>
#include "preason.h"
#include "utils.h"
void erase_job_preason(xce_job_preason_t* reasons)
{
if (reasons == NULL) {
return;
}
if (reasons->host_based_reasons != NULL) {
int i;
for (i = 0; i < reasons->nhost_reasons; i++) {
if (reasons->host_based_reasons[i] != NULL) {
FREEUP(reasons->host_based_reasons[i]->host);
FREEUP(reasons->host_based_reasons[i]);
}
}
FREEUP(reasons->host_based_reasons);
reasons->nhost_reasons = 0;
}
if (reasons->res_based_reasons != NULL) {
int i;
for (i = 0; i < reasons->nres_reasons; i++) {
if (reasons->res_based_reasons[i] == NULL) {
continue;
}
FREEUP(reasons->res_based_reasons[i]->resource);
FREEUP(reasons->res_based_reasons[i]->host);
FREEUP(reasons->res_based_reasons[i]);
}
FREEUP(reasons->res_based_reasons);
reasons->nres_reasons = 0;
}
reasons->main_reason = 0;
}
static int add_host_preason(xce_job_preason_t* reasons, int code, char* host)
{
xce_host_reason_t** p;
xce_host_reason_t* p1;
char* h;
int count;
if ((reasons == NULL) || (host == NULL)) {
return -EINVAL;
}
h = strdup(host);
if (h == NULL) {
return -ENOMEM;
}
p1 = (xce_host_reason_t*)calloc(1, sizeof(*p1));
if (p1 == NULL) {
FREEUP(h);
return -ENOMEM;
}
p1->reason = code;
p1->host = h;
count = reasons->nhost_reasons;
p = (xce_host_reason_t**)realloc(reasons->host_based_reasons,
(count + 1) * sizeof(xce_host_reason_t*));
if (p == NULL) {
FREEUP(h);
FREEUP(p1);
return -ENOMEM;
}
reasons->host_based_reasons = p;
reasons->host_based_reasons[count] = p1;
reasons->nhost_reasons++;
return reasons->nhost_reasons;
}
static int add_res_preason(xce_job_preason_t* reasons, int code, char* host,
char* res)
{
xce_res_reason_t** p;
char* h;
char* r;
int count;
xce_res_reason_t* p1;
if ((reasons == NULL) || (res == NULL)) {
return -EINVAL;
}
/* FIXME: global resource reason */
if (host == NULL) {
host = "";
}
h = strdup(host);
r = strdup(res);
p1 = (xce_res_reason_t*)calloc(1, sizeof(*p1));
if ((h == NULL) || (r == NULL) || (p1 == NULL)) {
FREEUP(h);
FREEUP(r);
FREEUP(p1);
return -ENOMEM;
}
p1->host = h;
p1->resource = r;
p1->reason = code;
count = reasons->nres_reasons;
p = (xce_res_reason_t**)realloc(reasons->res_based_reasons,
(count + 1) * sizeof(*p));
if (p == NULL) {
FREEUP(h);
FREEUP(r);
FREEUP(p1);
return -ENOMEM;
}
reasons->res_based_reasons = p;
reasons->res_based_reasons[count] = p1;
reasons->nres_reasons++;
return reasons->nres_reasons;
}
int add_job_preason(xce_job_preason_t* reasons, int code, char* host, char* res)
{
int rc = 0;
if ((host == NULL) && (res == NULL)) {
/* set main reason */
erase_job_preason(reasons);
reasons->main_reason = code;
} else if (res == NULL) {
/* set host reason */
rc = add_host_preason(reasons, code, host);
} else {
/* set resource reason */
rc = add_res_preason(reasons, code, host, res);
}
return rc;
}
xce_pendreason_t *make_pendreason(uint64_t jobid) {
xce_pendreason_t *reason = NULL;
xce_job_preason_t *preason = NULL;
preason = (xce_job_preason_t *)calloc(1, sizeof(*preason));
reason = (xce_pendreason_t*)calloc(1, sizeof(*reason));
if ((preason == NULL) || (reason == NULL)) {
FREEUP(reason);
FREEUP(preason);
return NULL;
}
reason->jobid = jobid;
reason->reasons = preason;
return reason;
}