What: On close some frameworks either: 1) close their output twice (calling both opal_output_close and mca_base_components_close), or 2) don't close their output.
This patch ensures that all frameworks that call opal_output_open have exactly one call to either opal_output_close OR mca_base_components_close. Why: I am working on cleaning up the MCA system in preparation for adding support for MPI_T_cvar_write. I came across this potential problem and figured it should probably be fixed. When: Since this patch shouldn't take long to review I am setting a very short timeout: tomorrow (Nov 2), 12:00pm MDT. Questions? Comments? -Nathan Hjelm HPC-3, LANL
diff --git a/ompi/mca/btl/base/btl_base_close.c b/ompi/mca/btl/base/btl_base_close.c index b3632ab..21ffb90 100644 --- a/ompi/mca/btl/base/btl_base_close.c +++ b/ompi/mca/btl/base/btl_base_close.c @@ -58,11 +58,9 @@ int mca_btl_base_close(void) /* Close all remaining opened components (may be one if this is a OMPI RTE program, or [possibly] multiple if this is ompi_info) */ - - if (0 != opal_list_get_size(&mca_btl_base_components_opened)) { - mca_base_components_close(mca_btl_base_output, - &mca_btl_base_components_opened, NULL); - } + + mca_base_components_close(mca_btl_base_output, + &mca_btl_base_components_opened, NULL); /* cleanup */ if(NULL != mca_btl_base_include) diff --git a/ompi/mca/fbtl/base/fbtl_base_close.c b/ompi/mca/fbtl/base/fbtl_base_close.c index c838408..f8c45ab 100644 --- a/ompi/mca/fbtl/base/fbtl_base_close.c +++ b/ompi/mca/fbtl/base/fbtl_base_close.c @@ -45,10 +45,12 @@ int mca_fbtl_base_close(void) &mca_fbtl_base_components_available, NULL); OBJ_DESTRUCT(&mca_fbtl_base_components_available); mca_fbtl_base_components_available_valid = false; + } else { + /* Close the output stream for this framework if it is open */ + opal_output_close (mca_fbtl_base_output); } - /* Close the output stream for this framework */ - opal_output_close (mca_fbtl_base_output); + mca_fbtl_base_output = -1; /* All done */ diff --git a/ompi/mca/fcoll/base/fcoll_base_close.c b/ompi/mca/fcoll/base/fcoll_base_close.c index 5f2ef3e..34295b7 100644 --- a/ompi/mca/fcoll/base/fcoll_base_close.c +++ b/ompi/mca/fcoll/base/fcoll_base_close.c @@ -46,10 +46,12 @@ int mca_fcoll_base_close(void) &mca_fcoll_base_components_available, NULL); OBJ_DESTRUCT(&mca_fcoll_base_components_available); mca_fcoll_base_components_available_valid = false; + } else { + /* Close the output stream for this framework if it is open */ + opal_output_close (mca_fcoll_base_output); } - /* Close the output stream for this framework */ - opal_output_close (mca_fcoll_base_output); + mca_fcoll_base_output = -1; /* All done */ diff --git a/ompi/mca/fs/base/fs_base_close.c b/ompi/mca/fs/base/fs_base_close.c index 3dc55bf..68cc2b5 100644 --- a/ompi/mca/fs/base/fs_base_close.c +++ b/ompi/mca/fs/base/fs_base_close.c @@ -46,10 +46,12 @@ int mca_fs_base_close(void) &mca_fs_base_components_available, NULL); OBJ_DESTRUCT(&mca_fs_base_components_available); mca_fs_base_components_available_valid = false; + } else { + /* Close the output stream for this framework if it is open */ + opal_output_close (mca_fs_base_output); } - /* Close the output stream for this framework */ - opal_output_close (mca_fs_base_output); + mca_fs_base_output = -1; /* All done */ diff --git a/ompi/mca/io/base/io_base_close.c b/ompi/mca/io/base/io_base_close.c index 9038663..7f408d6 100644 --- a/ompi/mca/io/base/io_base_close.c +++ b/ompi/mca/io/base/io_base_close.c @@ -44,8 +44,12 @@ int mca_io_base_close(void) &mca_io_base_components_available, NULL); OBJ_DESTRUCT(&mca_io_base_components_available); mca_io_base_components_available_valid = false; + } else { + opal_output_close (mca_io_base_output); } + mca_io_base_output = -1; + /* All done */ return OMPI_SUCCESS; diff --git a/ompi/mca/op/base/op_base_close.c b/ompi/mca/op/base/op_base_close.c index 83755be..543b52a 100644 --- a/ompi/mca/op/base/op_base_close.c +++ b/ompi/mca/op/base/op_base_close.c @@ -44,8 +44,12 @@ int ompi_op_base_close(void) NULL); OBJ_DESTRUCT(&ompi_op_base_components_available); ompi_op_base_components_available_valid = false; + } else { + opal_output_close (ompi_op_base_output); } + ompi_op_base_output = -1; + /* All done */ return OMPI_SUCCESS; diff --git a/ompi/mca/sharedfp/base/sharedfp_base_close.c b/ompi/mca/sharedfp/base/sharedfp_base_close.c index 86cf686..f888467 100644 --- a/ompi/mca/sharedfp/base/sharedfp_base_close.c +++ b/ompi/mca/sharedfp/base/sharedfp_base_close.c @@ -46,10 +46,12 @@ int mca_sharedfp_base_close(void) &mca_sharedfp_base_components_available, NULL); OBJ_DESTRUCT(&mca_sharedfp_base_components_available); mca_sharedfp_base_components_available_valid = false; + } else { + /* Close the output stream for this framework */ + opal_output_close (mca_sharedfp_base_output); } - /* Close the output stream for this framework */ - opal_output_close (mca_sharedfp_base_output); + mca_sharedfp_base_output = -1; /* All done */ diff --git a/ompi/mca/topo/base/topo_base_close.c b/ompi/mca/topo/base/topo_base_close.c index 8089a58..9ca6664 100644 --- a/ompi/mca/topo/base/topo_base_close.c +++ b/ompi/mca/topo/base/topo_base_close.c @@ -41,10 +41,12 @@ int mca_topo_base_close(void) mca_base_components_close (mca_topo_base_output, &mca_topo_base_components_available, NULL); mca_topo_base_components_available_valid = false; + } else { + /* Close the output stream for this framework if it is open */ + opal_output_close (mca_topo_base_output); } - /* Close the output stream for this framework */ - opal_output_close (mca_topo_base_output); + mca_topo_base_output = -1; /* * All done diff --git a/opal/mca/event/base/event_base_close.c b/opal/mca/event/base/event_base_close.c index 6ecb89f..cdfc013 100644 --- a/opal/mca/event/base/event_base_close.c +++ b/opal/mca/event/base/event_base_close.c @@ -31,6 +31,11 @@ int opal_event_base_close(void) } OBJ_DESTRUCT(&opal_event_components); + if (-1 != opal_event_base_output) { + opal_output_close (opal_event_base_output); + opal_event_base_output = -1; + } + /* All done */ return OPAL_SUCCESS; } diff --git a/opal/mca/hwloc/base/hwloc_base_close.c b/opal/mca/hwloc/base/hwloc_base_close.c index fa22c96..068ea54 100644 --- a/opal/mca/hwloc/base/hwloc_base_close.c +++ b/opal/mca/hwloc/base/hwloc_base_close.c @@ -40,6 +40,11 @@ int opal_hwloc_base_close(void) hwloc_bitmap_free(opal_hwloc_my_cpuset); opal_hwloc_my_cpuset = NULL; } + + if (-1 != opal_hwloc_base_output) { + opal_output_close (opal_hwloc_base_output); + opal_hwloc_base_output = -1; + } } #endif diff --git a/opal/mca/if/base/if_base_components.c b/opal/mca/if/base/if_base_components.c index 906c971..1be27fa 100644 --- a/opal/mca/if/base/if_base_components.c +++ b/opal/mca/if/base/if_base_components.c @@ -112,6 +112,11 @@ int opal_if_base_close(void) } OBJ_DESTRUCT(&opal_if_components); + if (-1 != opal_if_base_output) { + opal_output_close (opal_if_base_output); + opal_if_base_output = -1; + } + return OPAL_SUCCESS; } diff --git a/opal/mca/installdirs/base/installdirs_base_components.c b/opal/mca/installdirs/base/installdirs_base_components.c index 0d9d1c7..7aab79d 100644 --- a/opal/mca/installdirs/base/installdirs_base_components.c +++ b/opal/mca/installdirs/base/installdirs_base_components.c @@ -19,7 +19,6 @@ #include "opal/mca/installdirs/base/base.h" #include "opal/mca/installdirs/base/static-components.h" -int opal_installdirs_base_output; opal_install_dirs_t opal_install_dirs; opal_list_t opal_installdirs_components; diff --git a/opal/mca/memchecker/base/memchecker_base_close.c b/opal/mca/memchecker/base/memchecker_base_close.c index fbfa7cd..55fb455 100644 --- a/opal/mca/memchecker/base/memchecker_base_close.c +++ b/opal/mca/memchecker/base/memchecker_base_close.c @@ -20,7 +20,8 @@ int opal_memchecker_base_close(void) { /* Close all components that are still open (this should only happen during laminfo). */ - mca_base_components_close(0, &opal_memchecker_base_components_opened, NULL); + mca_base_components_close(opal_memchecker_base_output, + &opal_memchecker_base_components_opened, NULL); OBJ_DESTRUCT(&opal_memchecker_base_components_opened); /* All done */ diff --git a/opal/mca/shmem/base/shmem_base_close.c b/opal/mca/shmem/base/shmem_base_close.c index a4755ee..e24acad 100644 --- a/opal/mca/shmem/base/shmem_base_close.c +++ b/opal/mca/shmem/base/shmem_base_close.c @@ -46,8 +46,12 @@ opal_shmem_base_close(void) &opal_shmem_base_components_opened, NULL); OBJ_DESTRUCT(&opal_shmem_base_components_opened); opal_shmem_base_components_opened_valid = false; + } else { + opal_output_close (opal_shmem_base_output); } + opal_shmem_base_output = -1; + /* all done */ return OPAL_SUCCESS; } diff --git a/orte/mca/db/base/db_base_close.c b/orte/mca/db/base/db_base_close.c index 719e397..9e51124 100644 --- a/orte/mca/db/base/db_base_close.c +++ b/orte/mca/db/base/db_base_close.c @@ -33,7 +33,7 @@ orte_db_base_close(void) &orte_db_base.available_components, NULL); OBJ_DESTRUCT(&orte_db_base.available_components); - opal_output_close(orte_db_base.output); + return ORTE_SUCCESS; } diff --git a/orte/mca/odls/base/odls_base_close.c b/orte/mca/odls/base/odls_base_close.c index 036496b..165a69e 100644 --- a/orte/mca/odls/base/odls_base_close.c +++ b/orte/mca/odls/base/odls_base_close.c @@ -53,11 +53,6 @@ int orte_odls_base_close(void) } OBJ_RELEASE(orte_local_children); - /* if no components are available, then punt */ - if (!orte_odls_base.components_available) { - return ORTE_SUCCESS; - } - /* Close all available components (only one in this case) */ mca_base_components_close(orte_odls_globals.output,