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) {