From e001d4955ca4d0c3f8e52fa55f8e9b45dbd32fe6 Mon Sep 17 00:00:00 2001 From: Rongsong Shen Date: Wed, 10 Dec 2025 15:25:05 +0800 Subject: [PATCH] fix memory leak --- src/controller/job.c | 3 +- src/controller/testsuite/test.c | 56 +++++++++++++------------------- src/controller/xceobjs.c | 57 +++++++++++++-------------------- 3 files changed, 48 insertions(+), 68 deletions(-) diff --git a/src/controller/job.c b/src/controller/job.c index d74659a..da6bf5a 100644 --- a/src/controller/job.c +++ b/src/controller/job.c @@ -410,8 +410,9 @@ int handle_jobdispatch(cluster_t* c, endpoint_t* ep, xce_request_t* request) } else { /* notify dispatch ok */ notify_dispatch(c, ep, alloc->jobid, 0); - free_JobAlloc_ptr(&(alloc)); } + + free_JobAlloc_ptr(&(alloc)); } return rc; } diff --git a/src/controller/testsuite/test.c b/src/controller/testsuite/test.c index 3d9d17c..3b210fd 100644 --- a/src/controller/testsuite/test.c +++ b/src/controller/testsuite/test.c @@ -13,6 +13,7 @@ #include #include +#include #include "client.h" #include "controller.capnp.h" @@ -60,11 +61,25 @@ typedef struct { int ntasks; } host_task_t; +typedef struct { + char* PATH; +} sub_envs_t; + +typedef struct { + sub_envs_t sub_env_vars; +} exdata_t; + #define MAX_RUN_JOBS (20) #define MAX_TASK_HOSTS (5) #define MAX_RUN_TASKS (50) #define RUSAGE_UPDATE_INTERVAL (60) +#define S2J_JSON_SET_var_string_ELEMENT(to_json, from_struct, _element) \ + if (((from_struct) != NULL) && (((from_struct)->_element) != NULL)) { \ + cJSON_AddStringToObject((to_json), #_element, \ + (from_struct)->_element); \ + } + static run_job_t run_jobs[MAX_RUN_JOBS]; static run_task_t run_tasks[MAX_RUN_TASKS]; @@ -767,41 +782,16 @@ int cmd_jobrun(int argc, char* argv[]) static int build_job_envs(xce_job_submit_t* submit) { - char* names[] = { "PATH", "LSAN_OPTIONS", NULL }; - int i; - cJSON* top; - cJSON* envars; - char* exdata; + exdata_t exdata = { .sub_env_vars = { .PATH = getenv("PATH") } }; - top = cJSON_CreateObject(); - if (top == NULL) { - return -1; - } + s2j_create_json_obj(json_exdata); + s2j_create_json_obj(json_envs); + s2j_json_set_basic_element(json_envs, &(exdata.sub_env_vars), var_string, + PATH); + cJSON_AddItemToObject(json_exdata, "sub_env_vars", json_envs); - envars = cJSON_CreateObject(); - if (envars == NULL) { - return -1; - } - - cJSON_AddItemToObject(top, "sub_env_vars", envars); - - for (i = 0; names[i] != NULL; i++) { - cJSON* val; - char* s = getenv(names[i]); - - if (s == NULL) { - s = ""; - } - - val = cJSON_CreateString(s); - cJSON_AddItemToObject(envars, names[i], val); - } - - exdata = cJSON_Print(top); - - submit->submit->start_info->exdata = exdata; - - cJSON_Delete(top); + submit->submit->start_info->exdata = cJSON_Print(json_exdata); + cJSON_Delete(json_exdata); return 0; } diff --git a/src/controller/xceobjs.c b/src/controller/xceobjs.c index 4bcc9a6..3a576d6 100644 --- a/src/controller/xceobjs.c +++ b/src/controller/xceobjs.c @@ -250,12 +250,28 @@ void job_obj_killer(job_t* job) } obj = TO_MYOBJ(job); - DEREF_OBJ(job->job.submit->queue); - DEREF_OBJ(job->job.submit->user); - DEREF_OBJ(job->job.submit->job_name); - DEREF_OBJ(job->job.submit->project_name); - DEREF_OBJ(job->job.submit->job_description); - DEREF_OBJ(job->job.submit->resreq); + if (job->job.submit != NULL) { + DEREF_OBJ(job->job.submit->queue); + DEREF_OBJ(job->job.submit->user); + DEREF_OBJ(job->job.submit->job_name); + DEREF_OBJ(job->job.submit->project_name); + DEREF_OBJ(job->job.submit->job_description); + DEREF_OBJ(job->job.submit->resreq); + + if (job->job.submit->start_info != NULL) { + DEREF_OBJ(job->job.submit->start_info->cmdline); + DEREF_OBJ(job->job.submit->start_info->exechome); + DEREF_OBJ(job->job.submit->start_info->execcwd); + DEREF_OBJ(job->job.submit->start_info->execuser); + DEREF_OBJ(job->job.submit->start_info->exdata); + DEREF_OBJ(job->job.submit->start_info->launch_type); + DEREF_OBJ(job->job.submit->start_info->job_pre_exec); + DEREF_OBJ(job->job.submit->start_info->job_post_exec); + FREEUP(job->job.submit->start_info); + } + + FREEUP(job->job.submit); + } if (job->job.pidinfo != NULL) { FREEUP(job->job.pidinfo->pids); @@ -268,22 +284,7 @@ void job_obj_killer(job_t* job) } if (job->job.allocs != NULL) { - for (int i = 0; i < job->job.allocs->nhosts; i++) { - FREEUP(job->job.allocs->allocs[i]->host); - for (int k = 0; k < job->job.allocs->allocs[i]->nallocs; k++) { - xce_alloc_t* alloc - = (xce_alloc_t*)job->job.allocs->allocs[i]->allocs[k]; - if (alloc == NULL) { - continue; - } - FREEUP(alloc->resname); - FREEUP(alloc->reserve); - free(alloc); - } - FREEUP(job->job.allocs->allocs[i]); - } - FREEUP(job->job.allocs->allocs); - FREEUP(job->job.allocs); + free_JobAlloc_ptr(&(job->job.allocs)); } if (job->job.run_usage != NULL) { @@ -295,18 +296,6 @@ void job_obj_killer(job_t* job) FREEUP(job->job.run_usage); } - if (job->job.submit->start_info != NULL) { - DEREF_OBJ(job->job.submit->start_info->cmdline); - DEREF_OBJ(job->job.submit->start_info->exechome); - DEREF_OBJ(job->job.submit->start_info->execcwd); - DEREF_OBJ(job->job.submit->start_info->execuser); - DEREF_OBJ(job->job.submit->start_info->exdata); - DEREF_OBJ(job->job.submit->start_info->launch_type); - DEREF_OBJ(job->job.submit->start_info->job_pre_exec); - DEREF_OBJ(job->job.submit->start_info->job_post_exec); - FREEUP(job->job.submit->start_info); - } - FREEUP(job->job.exit_info); memset(obj, 0x0, sizeof(*obj));