Пример #1
0
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;
}
Пример #2
0
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();
    }
}