int ompi_mtl_psm2_finalize(struct mca_mtl_base_module_t* mtl) { psm2_error_t err; opal_progress_unregister(ompi_mtl_psm2_progress); /* free resources */ err = psm2_mq_finalize(ompi_mtl_psm2.mq); if (err) { opal_output(0, "Error in psm2_mq_finalize (error %s)\n", psm2_error_get_string(err)); return OMPI_ERROR; } err = psm2_ep_close(ompi_mtl_psm2.ep, PSM2_EP_CLOSE_GRACEFUL, 1*1e9); if (err) { opal_output(0, "Error in psm2_ep_close (error %s)\n", psm2_error_get_string(err)); return OMPI_ERROR; } err = psm2_finalize(); if (err) { opal_output(0, "Error in psm2_finalize (error %s)\n", psm2_error_get_string(err)); return OMPI_ERROR; } return OMPI_SUCCESS; }
static void psmx2_fini(void) { FI_INFO(&psmx2_prov, FI_LOG_CORE, "\n"); if (! --psmx2_init_count) { /* This function is called from a library destructor, which is called * automatically when exit() is called. The call to psm2_finalize() * might cause deadlock if the applicaiton is terminated with Ctrl-C * -- the application could be inside a PSM call, holding a lock that * psm2_finalize() tries to acquire. This can be avoided by only * calling psm2_finalize() when PSM is guaranteed to be unused. */ if (psmx2_active_fabric) FI_INFO(&psmx2_prov, FI_LOG_CORE, "psmx2_active_fabric != NULL, skip psm2_finalize\n"); else psm2_finalize(); } }