Folks,

there is a small memory leak in ompi/mca/pml/bfo/pml_bfo_component.c

in my environment, this module is not used.
this means mca_pml_bfo_component_open() and mca_pml_bfo_component_close()
are invoked but
mca_pml_bfo_component_init() and mca_pml_bfo_component_fini() are *not*
invoked.

mca_pml_bfo.allocator is currently allocated in
mca_pml_bfo_component_open() and released in mca_pml_bfo_component_fini()
this causes a leak (at least in my environment, since
mca_pml_bfo_component_fini() is not invoked)

One option is to release the allocator in mca_pml_bfo_component_close()
An other option is to allocate the allocator in mca_pml_bfo_component_init()

Which is the correct/best one ?

i attached two patches, which one (if any) should be commited ?

Thanks in advance for your insights

Gilles
Index: ompi/mca/pml/bfo/pml_bfo_component.c
===================================================================
--- ompi/mca/pml/bfo/pml_bfo_component.c	(revision 31788)
+++ ompi/mca/pml/bfo/pml_bfo_component.c	(working copy)
@@ -12,6 +12,8 @@
  *                         All rights reserved.
  * Copyright (c) 2007-2010 Cisco Systems, Inc.  All rights reserved.
  * Copyright (c) 2010      Oracle and/or its affiliates.  All rights reserved.
+ * Copyright (c) 2014      Research Organization for Information Science
+ *                         and Technology (RIST). All rights reserved.
  * $COPYRIGHT$
  * 
  * Additional copyrights may follow
@@ -149,25 +151,9 @@
 
 static int mca_pml_bfo_component_open(void)
 {
-    mca_allocator_base_component_t* allocator_component;
-
     mca_pml_bfo_output = opal_output_open(NULL);
     opal_output_set_verbosity(mca_pml_bfo_output, mca_pml_bfo_verbose);
 
-    allocator_component = mca_allocator_component_lookup( mca_pml_bfo.allocator_name );
-    if(NULL == allocator_component) {
-        opal_output(0, "mca_pml_bfo_component_open: can't find allocator: %s\n", mca_pml_bfo.allocator_name);
-        return OMPI_ERROR;
-    }
-
-    mca_pml_bfo.allocator = allocator_component->allocator_init(true,
-                                                                mca_pml_bfo_seg_alloc,
-                                                                mca_pml_bfo_seg_free, NULL);
-    if(NULL == mca_pml_bfo.allocator) {
-        opal_output(0, "mca_pml_bfo_component_open: unable to initialize allocator\n");
-        return OMPI_ERROR;
-    }
-
     mca_pml_bfo.enabled = false; 
     return mca_base_framework_open(&ompi_bml_base_framework, 0); 
 }
@@ -191,6 +177,8 @@
                             bool enable_progress_threads,
                             bool enable_mpi_threads )
 {
+    mca_allocator_base_component_t* allocator_component;
+
     opal_output_verbose( 10, mca_pml_bfo_output,
                          "in bfo, my priority is %d\n", mca_pml_bfo.priority);
 
@@ -200,6 +188,21 @@
     }
     *priority = mca_pml_bfo.priority;
 
+    allocator_component = mca_allocator_component_lookup( mca_pml_bfo.allocator_name );
+    if(NULL == allocator_component) {
+        opal_output(0, "mca_pml_bfo_component_open: can't find allocator: %s\n", mca_pml_bfo.allocator_name);
+        return NULL;
+    }
+
+    mca_pml_bfo.allocator = allocator_component->allocator_init(true,
+                                                                mca_pml_bfo_seg_alloc,
+                                                                mca_pml_bfo_seg_free, NULL);
+    if(NULL == mca_pml_bfo.allocator) {
+        opal_output(0, "mca_pml_bfo_component_open: unable to initialize allocator\n");
+        return NULL;
+    }
+
+
     if(OMPI_SUCCESS != mca_bml_base_init( enable_progress_threads, 
                                           enable_mpi_threads)) {
         return NULL;
Index: ompi/mca/pml/bfo/pml_bfo_component.c
===================================================================
--- ompi/mca/pml/bfo/pml_bfo_component.c	(revision 31785)
+++ ompi/mca/pml/bfo/pml_bfo_component.c	(working copy)
@@ -12,6 +12,8 @@
  *                         All rights reserved.
  * Copyright (c) 2007-2010 Cisco Systems, Inc.  All rights reserved.
  * Copyright (c) 2010      Oracle and/or its affiliates.  All rights reserved.
+ * Copyright (c) 2014      Research Organization for Information Science
+ *                         and Technology (RIST). All rights reserved.
  * $COPYRIGHT$
  * 
  * Additional copyrights may follow
@@ -180,6 +182,9 @@
     if (OMPI_SUCCESS != (rc = mca_base_framework_close(&ompi_bml_base_framework))) {
          return rc;
     }
+    if(OMPI_SUCCESS != (rc = mca_pml_bfo.allocator->alc_finalize(mca_pml_bfo.allocator))) {
+        return rc;
+    }
     opal_output_close(mca_pml_bfo_output);
 
     return OMPI_SUCCESS;
@@ -237,10 +242,6 @@
     OBJ_DESTRUCT(&mca_pml_bfo.rdma_frags);
     OBJ_DESTRUCT(&mca_pml_bfo.lock);
 
-    if(OMPI_SUCCESS != (rc = mca_pml_bfo.allocator->alc_finalize(mca_pml_bfo.allocator))) {
-        return rc;
-    }
-
 #if 0
     if (mca_pml_base_send_requests.fl_num_allocated !=
         mca_pml_base_send_requests.super.opal_list_length) {

Reply via email to