1
1
openmpi/opal/mca/installdirs/base/installdirs_base_components.c
Nathan Hjelm a7b0c00ab6 fix memory leaks and valgrind errors
This commit fixes several vagrind errors. Included:

 - installdirs did not correctly reinitialize all pointers to NULL
   at close. This causes valgrind errors on a subsequent call to
   opal_init_tool.

 - several opal strings were leaked by opal_deregister_params which
   was setting them to NULL instead of letting them be freed by the
   MCA variable system.

 - move opal_net_init to AFTER the variable system is initialized and
   opal's MCA variables have been registered. opal_net_init uses a
   variable registered by opal_register_params!

 - do not leak ompi_mpi_main_thread when it is allocated by
   MPI_T_init_thread.

 - do not overwrite ompi_mpi_main_thread if it is already set (by
   MPI_T_init_thread).

 - mca_base_var: read_files was overwritting mca_base_var_file_list
   even if it was non-NULL.

 - mca_base_var: set all file global variables to initial states on
   finalize.

 - btl/vader: decrement enumerator reference count to ensure that it
   is freed.

Signed-off-by: Nathan Hjelm <hjelmn@lanl.gov>
2015-04-11 09:28:35 -06:00

176 строки
7.8 KiB
C

/*
* Copyright (c) 2006-2012 Los Alamos National Security, LLC. All rights
* reserved.
* Copyright (c) 2007 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2010 Sandia National Laboratories. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*
*/
#include "opal_config.h"
#include "opal/constants.h"
#include "opal/mca/mca.h"
#include "opal/mca/installdirs/installdirs.h"
#include "opal/mca/installdirs/base/base.h"
#include "opal/mca/installdirs/base/static-components.h"
opal_install_dirs_t opal_install_dirs;
#define CONDITIONAL_COPY(target, origin, field) \
do { \
if (origin.field != NULL && target.field == NULL) { \
target.field = origin.field; \
} \
} while (0)
static int
opal_installdirs_base_open(mca_base_open_flag_t flags)
{
mca_base_component_list_item_t *component_item;
int ret;
ret = mca_base_framework_components_open (&opal_installdirs_base_framework,
flags);
if (OPAL_SUCCESS != ret) {
return ret;
}
OPAL_LIST_FOREACH(component_item, &opal_installdirs_base_framework.framework_components, mca_base_component_list_item_t) {
const opal_installdirs_base_component_t *component =
(const opal_installdirs_base_component_t *) component_item->cli_component;
/* copy over the data, if something isn't already there */
CONDITIONAL_COPY(opal_install_dirs, component->install_dirs_data,
prefix);
CONDITIONAL_COPY(opal_install_dirs, component->install_dirs_data,
exec_prefix);
CONDITIONAL_COPY(opal_install_dirs, component->install_dirs_data,
bindir);
CONDITIONAL_COPY(opal_install_dirs, component->install_dirs_data,
sbindir);
CONDITIONAL_COPY(opal_install_dirs, component->install_dirs_data,
libexecdir);
CONDITIONAL_COPY(opal_install_dirs, component->install_dirs_data,
datarootdir);
CONDITIONAL_COPY(opal_install_dirs, component->install_dirs_data,
datadir);
CONDITIONAL_COPY(opal_install_dirs, component->install_dirs_data,
sysconfdir);
CONDITIONAL_COPY(opal_install_dirs, component->install_dirs_data,
sharedstatedir);
CONDITIONAL_COPY(opal_install_dirs, component->install_dirs_data,
localstatedir);
CONDITIONAL_COPY(opal_install_dirs, component->install_dirs_data,
libdir);
CONDITIONAL_COPY(opal_install_dirs, component->install_dirs_data,
includedir);
CONDITIONAL_COPY(opal_install_dirs, component->install_dirs_data,
infodir);
CONDITIONAL_COPY(opal_install_dirs, component->install_dirs_data,
mandir);
CONDITIONAL_COPY(opal_install_dirs, component->install_dirs_data,
opaldatadir);
CONDITIONAL_COPY(opal_install_dirs, component->install_dirs_data,
opallibdir);
CONDITIONAL_COPY(opal_install_dirs, component->install_dirs_data,
opalincludedir);
}
/* expand out all the fields */
opal_install_dirs.prefix =
opal_install_dirs_expand_setup(opal_install_dirs.prefix);
opal_install_dirs.exec_prefix =
opal_install_dirs_expand_setup(opal_install_dirs.exec_prefix);
opal_install_dirs.bindir =
opal_install_dirs_expand_setup(opal_install_dirs.bindir);
opal_install_dirs.sbindir =
opal_install_dirs_expand_setup(opal_install_dirs.sbindir);
opal_install_dirs.libexecdir =
opal_install_dirs_expand_setup(opal_install_dirs.libexecdir);
opal_install_dirs.datarootdir =
opal_install_dirs_expand_setup(opal_install_dirs.datarootdir);
opal_install_dirs.datadir =
opal_install_dirs_expand_setup(opal_install_dirs.datadir);
opal_install_dirs.sysconfdir =
opal_install_dirs_expand_setup(opal_install_dirs.sysconfdir);
opal_install_dirs.sharedstatedir =
opal_install_dirs_expand_setup(opal_install_dirs.sharedstatedir);
opal_install_dirs.localstatedir =
opal_install_dirs_expand_setup(opal_install_dirs.localstatedir);
opal_install_dirs.libdir =
opal_install_dirs_expand_setup(opal_install_dirs.libdir);
opal_install_dirs.includedir =
opal_install_dirs_expand_setup(opal_install_dirs.includedir);
opal_install_dirs.infodir =
opal_install_dirs_expand_setup(opal_install_dirs.infodir);
opal_install_dirs.mandir =
opal_install_dirs_expand_setup(opal_install_dirs.mandir);
opal_install_dirs.opaldatadir =
opal_install_dirs_expand_setup(opal_install_dirs.opaldatadir);
opal_install_dirs.opallibdir =
opal_install_dirs_expand_setup(opal_install_dirs.opallibdir);
opal_install_dirs.opalincludedir =
opal_install_dirs_expand_setup(opal_install_dirs.opalincludedir);
#if 0
fprintf(stderr, "prefix: %s\n", opal_install_dirs.prefix);
fprintf(stderr, "exec_prefix: %s\n", opal_install_dirs.exec_prefix);
fprintf(stderr, "bindir: %s\n", opal_install_dirs.bindir);
fprintf(stderr, "sbindir: %s\n", opal_install_dirs.sbindir);
fprintf(stderr, "libexecdir: %s\n", opal_install_dirs.libexecdir);
fprintf(stderr, "datarootdir: %s\n", opal_install_dirs.datarootdir);
fprintf(stderr, "datadir: %s\n", opal_install_dirs.datadir);
fprintf(stderr, "sysconfdir: %s\n", opal_install_dirs.sysconfdir);
fprintf(stderr, "sharedstatedir: %s\n", opal_install_dirs.sharedstatedir);
fprintf(stderr, "localstatedir: %s\n", opal_install_dirs.localstatedir);
fprintf(stderr, "libdir: %s\n", opal_install_dirs.libdir);
fprintf(stderr, "includedir: %s\n", opal_install_dirs.includedir);
fprintf(stderr, "infodir: %s\n", opal_install_dirs.infodir);
fprintf(stderr, "mandir: %s\n", opal_install_dirs.mandir);
fprintf(stderr, "pkgdatadir: %s\n", opal_install_dirs.pkgdatadir);
fprintf(stderr, "pkglibdir: %s\n", opal_install_dirs.pkglibdir);
fprintf(stderr, "pkgincludedir: %s\n", opal_install_dirs.pkgincludedir);
#endif
/* NTH: Is it ok not to close the components? If not we can add a flag
to mca_base_framework_components_close to indicate not to deregister
variable groups */
return OPAL_SUCCESS;
}
static int
opal_installdirs_base_close(void)
{
free(opal_install_dirs.prefix);
free(opal_install_dirs.exec_prefix);
free(opal_install_dirs.bindir);
free(opal_install_dirs.sbindir);
free(opal_install_dirs.libexecdir);
free(opal_install_dirs.datarootdir);
free(opal_install_dirs.datadir);
free(opal_install_dirs.sysconfdir);
free(opal_install_dirs.sharedstatedir);
free(opal_install_dirs.localstatedir);
free(opal_install_dirs.libdir);
free(opal_install_dirs.includedir);
free(opal_install_dirs.infodir);
free(opal_install_dirs.mandir);
free(opal_install_dirs.opaldatadir);
free(opal_install_dirs.opallibdir);
free(opal_install_dirs.opalincludedir);
memset (&opal_install_dirs, 0, sizeof (opal_install_dirs));
return mca_base_framework_components_close (&opal_installdirs_base_framework, NULL);
}
/* Declare the installdirs framework */
MCA_BASE_FRAMEWORK_DECLARE(opal, installdirs, NULL, NULL, opal_installdirs_base_open,
opal_installdirs_base_close, mca_installdirs_base_static_components,
MCA_BASE_FRAMEWORK_FLAG_NOREGISTER);