What: I used valgrind on ompi_info and found several leaks in the trunk. This 
patch fixes some of the leaks.

pml/v:
  - If vprotocol is not being used vprotocol_include_list is leaked. Assume 
vprotocol never takes ownership (see below) and always free the string.

coll/ml:
  - (patch verified) calling mca_base_param_lookup_string after 
mca_base_param_reg_string is unnecessary. The call to 
mca_base_param_lookup_string causes the value returned by 
mca_base_param_reg_string to be leaked.
  - Need to free mca_coll_ml_component.config_file_name on component close.

btl/openib:
  - calling mca_base_param_lookup_string after mca_base_param_reg_string is 
unnecessary. The call to mca_base_param_lookup_string causes the value returned 
by mca_base_param_reg_string to be leaked.

vprotocol/base:
  - There was no way for pml/v to determine if vprotocol took ownership of 
vprotocol_include_list. Fix by always never ownership (use strdup).

mca/base:
  - param_lookup will result in storage->stringval to be a newly allocated 
string if the mca parameter has a string value. ensure this string is always 
freed.


When: This is a simple patch. Timeout set for tomorrow @ 12:00 PM MST

Why: Always a good idea to clean up all allocated memory. With this patch and 
some others I have in the pipeline valgrind no longer reports and "possibly 
leaked" or "definitely leaked" blocks in ompi_info.


-Nathan Hjelm
HPC-3, LANL
Index: ompi/mca/pml/v/pml_v_component.c
===================================================================
--- ompi/mca/pml/v/pml_v_component.c    (revision 27561)
+++ ompi/mca/pml/v/pml_v_component.c    (working copy)
@@ -67,6 +67,7 @@
     int verbose;
     int priority;
     char *vprotocol_include_list;
+    int rc;

     priority = mca_pml_v_param_register_int("priority", -1);
     output = mca_pml_v_param_register_string("output", "stderr");
@@ -84,7 +85,10 @@

     V_OUTPUT_VERBOSE(500, "loaded");

-    return mca_vprotocol_base_open(vprotocol_include_list);
+    rc = mca_vprotocol_base_open(vprotocol_include_list);
+    free (vprotocol_include_list);
+
+    return rc;
 }

 static int mca_pml_v_component_close(void)
Index: ompi/mca/coll/ml/coll_ml_mca.c
===================================================================
--- ompi/mca/coll/ml/coll_ml_mca.c      (revision 27561)
+++ ompi/mca/coll/ml/coll_ml_mca.c      (working copy)
@@ -65,8 +65,6 @@
                                deprecated_param_name, true);
     }

-    mca_base_param_lookup_string(index, &value);
-
     if (0 != (flags & REGSTR_EMPTY_OK) && 0 == strlen(value)) {
         opal_output(0, "Bad parameter value for parameter \"%s\"",
                 param_name);
Index: ompi/mca/coll/ml/coll_ml_component.c
===================================================================
--- ompi/mca/coll/ml/coll_ml_component.c        (revision 27561)
+++ ompi/mca/coll/ml/coll_ml_component.c        (working copy)
@@ -390,6 +390,8 @@
     cs->base_sequence_number = -1;
     cs->progress_is_busy = false;

+    mca_coll_ml_component.config_file_name = NULL;
+
     /* load mca parametres */
     rc = mca_coll_ml_register_params();
     if (OMPI_SUCCESS != rc) {
@@ -477,6 +479,12 @@

     mca_coll_ml_component_t *cs = &mca_coll_ml_component;

+    /* Free the config file name (allocated by mca_coll_ml_register_params) */
+    if (NULL != mca_coll_ml_component.config_file_name) {
+        free (mca_coll_ml_component.config_file_name);
+        mca_coll_ml_component.config_file_name = NULL;
+    }
+
     /* There is not need to release/close resource if the 
      * priority was set to zero */
     if (cs->ml_priority <= 0) {
Index: ompi/mca/btl/openib/btl_openib_mca.c
===================================================================
--- ompi/mca/btl/openib/btl_openib_mca.c        (revision 27561)
+++ ompi/mca/btl/openib/btl_openib_mca.c        (working copy)
@@ -81,7 +81,6 @@
                                &mca_btl_openib_component.super.btl_version,
                                deprecated_param_name, true);
     }
-    mca_base_param_lookup_string(index, &value);

     if (0 != (flags & REGSTR_EMPTY_OK) && 0 == strlen(value)) {
         opal_output(0, "Bad parameter value for parameter \"%s\"",
Index: ompi/mca/vprotocol/base/vprotocol_base.c
===================================================================
--- ompi/mca/vprotocol/base/vprotocol_base.c    (revision 27561)
+++ ompi/mca/vprotocol/base/vprotocol_base.c    (working copy)
@@ -27,11 +27,11 @@
 int mca_vprotocol_base_open(char *vprotocol_include_list)
 {
     OBJ_CONSTRUCT(&mca_vprotocol_base_components_available, opal_list_t);
-    mca_vprotocol_base_include_list = vprotocol_include_list;
-    if (NULL == mca_vprotocol_base_include_list ||
+    if (NULL == vprotocol_include_list ||
        mca_vprotocol_base_include_list[0] == 0) {
         return OMPI_SUCCESS;
     }
+    mca_vprotocol_base_include_list = strdup (vprotocol_include_list);
     return mca_base_components_open("vprotocol", 0, 
                                     mca_vprotocol_base_static_components, 
                                     &mca_vprotocol_base_components_available, 
Index: opal/mca/base/mca_base_param.c
===================================================================
--- opal/mca/base/mca_base_param.c      (revision 27561)
+++ opal/mca/base/mca_base_param.c      (working copy)
@@ -10,6 +10,8 @@
  * Copyright (c) 2004-2005 The Regents of the University of California.
  *                         All rights reserved.
  * Copyright (c) 2008-2011 Cisco Systems, Inc.  All rights reserved.
+ * Copyright (c) 2012      Los Alamos National Security, LLC. All rights
+ *                         reserved.
  * $COPYRIGHT$
  * 
  * Additional copyrights may follow
@@ -514,8 +516,14 @@
 int mca_base_param_lookup_source(int index, mca_base_param_source_t *source, 
char **source_file)
 {
     mca_base_param_storage_t storage;
+
+    storage->stringval = NULL;

     if (param_lookup(index, &storage, source, source_file)) {
+        if (storage->stringval) {
+            free (storage->stringval);
+        }
+
         return OPAL_SUCCESS;
     }
     return OPAL_ERROR;

Reply via email to