1
1

Fix a pile of memory leaks in ORTE.

Fix a major memory leak in the SLURM RAS, and cleanup a bit of code there.

This commit was SVN r14164.
Этот коммит содержится в:
Tim Prins 2007-03-29 00:50:56 +00:00
родитель 6fb94b3ded
Коммит 9cb455272b
7 изменённых файлов: 43 добавлений и 32 удалений

Просмотреть файл

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana * Copyright (c) 2004-2007 The Trustees of Indiana University and Indiana
* University Research and Technology * University Research and Technology
* Corporation. All rights reserved. * Corporation. All rights reserved.
* Copyright (c) 2004-2006 The University of Tennessee and The University * Copyright (c) 2004-2006 The University of Tennessee and The University
@ -120,13 +120,13 @@ static int pls_slurm_launch_job(orte_jobid_t jobid)
size_t num_nodes; size_t num_nodes;
orte_vpid_t vpid; orte_vpid_t vpid;
orte_vpid_t start_vpid; orte_vpid_t start_vpid;
char *jobid_string; char *jobid_string = NULL;
char *uri, *param; char *uri, *param;
char **argv; char **argv;
int argc; int argc;
int rc; int rc;
char *tmp; char *tmp;
char** env; char** env = NULL;
char* var; char* var;
char *nodelist_flat; char *nodelist_flat;
char **nodelist_argv; char **nodelist_argv;
@ -246,6 +246,7 @@ static int pls_slurm_launch_job(orte_jobid_t jobid)
opal_argv_append(&nodelist_argc, &nodelist_argv, node->nodename); opal_argv_append(&nodelist_argc, &nodelist_argv, node->nodename);
} }
nodelist_flat = opal_argv_join(nodelist_argv, ','); nodelist_flat = opal_argv_join(nodelist_argv, ',');
opal_argv_free(nodelist_argv);
asprintf(&tmp, "--nodelist=%s", nodelist_flat); asprintf(&tmp, "--nodelist=%s", nodelist_flat);
opal_argv_append(&argc, &argv, tmp); opal_argv_append(&argc, &argv, tmp);
free(tmp); free(tmp);
@ -435,6 +436,12 @@ static int pls_slurm_launch_job(orte_jobid_t jobid)
cleanup: cleanup:
OBJ_RELEASE(map); OBJ_RELEASE(map);
opal_argv_free(argv);
opal_argv_free(env);
if(NULL != jobid_string) {
free(jobid_string);
}
while (NULL != (item = opal_list_remove_first(&daemons))) { while (NULL != (item = opal_list_remove_first(&daemons))) {
OBJ_RELEASE(item); OBJ_RELEASE(item);

Просмотреть файл

@ -166,7 +166,7 @@ static int orte_ras_slurm_discover(char *regexp, char *tasks_per_node,
opal_list_t* nodelist) opal_list_t* nodelist)
{ {
int i, j, len, ret, count, reps, num_nodes; int i, j, len, ret, count, reps, num_nodes;
char *base, **names = NULL, *temp; char *base, **names = NULL;
char *begptr, *endptr, *orig; char *begptr, *endptr, *orig;
int *slots; int *slots;
bool found_range = false; bool found_range = false;
@ -248,12 +248,7 @@ static int orte_ras_slurm_discover(char *regexp, char *tasks_per_node,
/* If we didn't find a range, just add the node */ /* If we didn't find a range, just add the node */
opal_output(orte_ras_base.ras_output, opal_output(orte_ras_base.ras_output,
"ras:slurm:allocate:discover: found node %s", base); "ras:slurm:allocate:discover: found node %s", base);
if(NULL == (temp = strdup(base))) { if(ORTE_SUCCESS != (ret = opal_argv_append_nosize(&names, base))) {
ORTE_ERROR_LOG(ORTE_ERR_OUT_OF_RESOURCE);
free(orig);
return ORTE_ERR_OUT_OF_RESOURCE;
}
if(ORTE_SUCCESS != (ret = opal_argv_append_nosize(&names, temp))) {
ORTE_ERROR_LOG(ret); ORTE_ERROR_LOG(ret);
free(orig); free(orig);
return ret; return ret;
@ -423,9 +418,9 @@ static int orte_ras_slurm_parse_ranges(char *base, char *ranges, char ***names)
*/ */
static int orte_ras_slurm_parse_range(char *base, char *range, char ***names) static int orte_ras_slurm_parse_range(char *base, char *range, char ***names)
{ {
char *str, temp1[BUFSIZ], temp2[BUFSIZ]; char *str, temp1[BUFSIZ];
size_t i, j, start, end; size_t i, j, start, end;
size_t base_len, len; size_t base_len, len, num_len;
size_t str_start, str_end; size_t str_start, str_end;
size_t num_str_len; size_t num_str_len;
bool found; bool found;
@ -490,34 +485,34 @@ static int orte_ras_slurm_parse_range(char *base, char *range, char ***names)
/* Make strings for all values in the range */ /* Make strings for all values in the range */
len = base_len + num_str_len + 32;
str = malloc(len);
if (NULL == str) {
ORTE_ERROR_LOG(ORTE_ERR_OUT_OF_RESOURCE);
return ORTE_ERR_OUT_OF_RESOURCE;
}
strcpy(str, base);
for (i = start; i <= end; ++i) { for (i = start; i <= end; ++i) {
len = base_len + 32; str[base_len] = '\0';
str = malloc(len); snprintf(temp1, BUFSIZ - 1, "%lu", (long) i);
if (NULL == str) {
ORTE_ERROR_LOG(ORTE_ERR_OUT_OF_RESOURCE);
return ORTE_ERR_OUT_OF_RESOURCE;
}
str[0] = '\0';
snprintf(temp1, BUFSIZ - 1, "%s", base);
snprintf(temp2, BUFSIZ - 1, "%lu", (long) i);
temp1[BUFSIZ - 1] = temp2[BUFSIZ - 1] = '\0';
/* Do we need zero pading? */ /* Do we need zero pading? */
if (strlen(temp2) < num_str_len) { if ((num_len = strlen(temp1)) < num_str_len) {
for (j = 0; j < num_str_len - strlen(temp2); ++j) { for (j = base_len; j < base_len + (num_str_len - num_len); ++j) {
strcat(temp1, "0"); str[j] = '0';
} }
str[j] = '\0';
} }
snprintf(str, len - 1, "%s%s", temp1, temp2); strcat(str, temp1);
str[len - 1] = '\0';
ret = opal_argv_append_nosize(names, str); ret = opal_argv_append_nosize(names, str);
if(ORTE_SUCCESS != ret) { if(ORTE_SUCCESS != ret) {
ORTE_ERROR_LOG(ret); ORTE_ERROR_LOG(ret);
free(str);
return ret; return ret;
} }
} }
free(str);
/* All done */ /* All done */
return ORTE_SUCCESS; return ORTE_SUCCESS;

Просмотреть файл

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana * Copyright (c) 2004-2007 The Trustees of Indiana University and Indiana
* University Research and Technology * University Research and Technology
* Corporation. All rights reserved. * Corporation. All rights reserved.
* Copyright (c) 2004-2005 The University of Tennessee and The University * Copyright (c) 2004-2005 The University of Tennessee and The University
@ -74,6 +74,10 @@ int orte_rds_base_close(void)
mca_base_components_close(orte_rds_base.rds_output, mca_base_components_close(orte_rds_base.rds_output,
&orte_rds_base.rds_components, NULL); &orte_rds_base.rds_components, NULL);
if(-1 != orte_rds_base.rds_output) {
opal_output_close(orte_rds_base.rds_output);
}
OBJ_DESTRUCT(&orte_rds_base.rds_selected); OBJ_DESTRUCT(&orte_rds_base.rds_selected);
return ORTE_SUCCESS; return ORTE_SUCCESS;
} }

Просмотреть файл

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana * Copyright (c) 2004-2007 The Trustees of Indiana University and Indiana
* University Research and Technology * University Research and Technology
* Corporation. All rights reserved. * Corporation. All rights reserved.
* Copyright (c) 2004-2005 The University of Tennessee and The University * Copyright (c) 2004-2005 The University of Tennessee and The University
@ -113,7 +113,6 @@ int orte_rds_base_open(void)
/* Debugging / verbose output */ /* Debugging / verbose output */
orte_rds_base.rds_output = opal_output_open(NULL);
param = mca_base_param_reg_int_name("rds_base", "verbose", param = mca_base_param_reg_int_name("rds_base", "verbose",
"Verbosity level for the rds framework", "Verbosity level for the rds framework",
false, false, 0, &value); false, false, 0, &value);

Просмотреть файл

@ -552,6 +552,9 @@ cleanup:
OBJ_RELEASE(values[i]); OBJ_RELEASE(values[i]);
} }
} }
if(NULL != segment) {
free(segment);
}
if(NULL != values) if(NULL != values)
free(values); free(values);
return rc; return rc;

Просмотреть файл

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana * Copyright (c) 2004-2007 The Trustees of Indiana University and Indiana
* University Research and Technology * University Research and Technology
* Corporation. All rights reserved. * Corporation. All rights reserved.
* Copyright (c) 2004-2006 The University of Tennessee and The University * Copyright (c) 2004-2006 The University of Tennessee and The University
@ -758,6 +758,8 @@ cleanup:
OBJ_DESTRUCT(&max_used_nodes); OBJ_DESTRUCT(&max_used_nodes);
OBJ_DESTRUCT(&fully_used_nodes); OBJ_DESTRUCT(&fully_used_nodes);
OBJ_DESTRUCT(&mapped_node_list); OBJ_DESTRUCT(&mapped_node_list);
OBJ_RELEASE(map);
free(save_bookmark); free(save_bookmark);

Просмотреть файл

@ -154,6 +154,7 @@ int orte_pre_condition_transports(orte_app_context_t **app_context, size_t num_c
} }
free(cs_env); free(cs_env);
free(format);
free(string_key); free(string_key);
return ORTE_SUCCESS; return ORTE_SUCCESS;