int mca_bml_r2_finalize( void ) { ompi_proc_t** procs; size_t p, num_procs; opal_list_item_t* w_item; if (NULL != btl_names) { free(btl_names); btl_names = NULL; } /* Similar to mca_bml_r2_del_btl ... */ procs = ompi_proc_all(&num_procs); if(NULL == procs) goto CLEANUP; for (w_item = opal_list_get_first(&mca_btl_base_modules_initialized); w_item != opal_list_get_end(&mca_btl_base_modules_initialized); w_item = opal_list_get_next(w_item)) { mca_btl_base_selected_module_t *sm = (mca_btl_base_selected_module_t *) w_item; mca_btl_base_module_t* btl = sm->btl_module; /* unregister the BTL progress function if any */ bml_r2_remove_btl_progress(btl); /* dont use this btl for any peers */ for( p = 0; p < num_procs; p++ ) { ompi_proc_t* proc = procs[p]; mca_bml_r2_del_proc_btl(proc, sm->btl_module); } } /* Release the procs as the ompi_proc_all increase their ref_count */ for( p = 0; p < num_procs; p++ ) { OBJ_RELEASE(procs[p]); } free(procs); CLEANUP: mca_bml_r2.num_btl_modules = 0; mca_bml_r2.num_btl_progress = 0; if( NULL != mca_bml_r2.btl_modules) { free( mca_bml_r2.btl_modules); mca_bml_r2.btl_modules = NULL; } if( NULL != mca_bml_r2.btl_progress ) { free( mca_bml_r2.btl_progress); mca_bml_r2.btl_progress = NULL; } /* Do not close the BTL base here; the BML upper layer will take care of that. */ return OMPI_SUCCESS; }
static int mca_bml_r2_del_btl(mca_btl_base_module_t* btl) { ompi_proc_t** procs; size_t i, m, p, num_procs; opal_list_item_t* item; mca_btl_base_module_t** modules; bool found = false; if(opal_list_get_size(&mca_btl_base_modules_initialized) == 2) { opal_output(0, "only one BTL left, can't failover"); return OMPI_SUCCESS; } procs = ompi_proc_all(&num_procs); if(NULL == procs) return OMPI_SUCCESS; /* Get rid of the associated progress function */ bml_r2_remove_btl_progress(btl); /* dont use this btl for any peers */ for( p = 0; p < num_procs; p++ ) { ompi_proc_t* proc = procs[p]; mca_bml_r2_del_proc_btl(proc, btl); } /* remove from the btl list */ for (item = opal_list_get_first(&mca_btl_base_modules_initialized); item != opal_list_get_end(&mca_btl_base_modules_initialized); item = opal_list_get_next(item)) { mca_btl_base_selected_module_t *sm = (mca_btl_base_selected_module_t *) item; if(sm->btl_module == btl) { opal_list_remove_item(&mca_btl_base_modules_initialized, item); free(sm); found = true; break; } } if(!found) { /* doesn't even exist */ goto CLEANUP; } /* remove from bml list */ modules = (mca_btl_base_module_t**)malloc(sizeof(mca_btl_base_module_t*) * mca_bml_r2.num_btl_modules-1); for(i=0,m=0; i<mca_bml_r2.num_btl_modules; i++) { if(mca_bml_r2.btl_modules[i] != btl) { modules[m++] = mca_bml_r2.btl_modules[i]; } } free(mca_bml_r2.btl_modules); mca_bml_r2.btl_modules = modules; mca_bml_r2.num_btl_modules = m; /* cleanup */ btl->btl_finalize(btl); CLEANUP: /* Decrease the ref_count increased by the call to ompi_proc_all */ for( p = 0; p < num_procs; p++ ) { OBJ_RELEASE(procs[p]); } free(procs); return OMPI_SUCCESS; }
int mca_bml_r2_del_btl(mca_btl_base_module_t* btl) { ompi_proc_t** procs; size_t i, j, m, p, num_procs; opal_list_item_t* item; mca_btl_base_module_t** modules; mca_btl_base_component_progress_fn_t * btl_progress_new; procs = ompi_proc_all(&num_procs); if(NULL == procs) return OMPI_SUCCESS; /* dont use this btl for any peers */ for(p=0; p<num_procs; p++) { ompi_proc_t* proc = procs[p]; mca_bml_r2_del_proc_btl(proc, btl); } /* remove from the btl list */ for (item = opal_list_get_first(&mca_btl_base_modules_initialized); item != opal_list_get_end(&mca_btl_base_modules_initialized); item = opal_list_get_next(item)) { mca_btl_base_selected_module_t *sm = (mca_btl_base_selected_module_t *) item; if(sm->btl_module == btl) { opal_list_remove_item(&mca_btl_base_modules_initialized, item); free(sm); break; } } /* remove from bml list */ modules = (mca_btl_base_module_t**)malloc(sizeof(mca_btl_base_module_t*) * mca_bml_r2.num_btl_modules-1); for(i=0,m=0; i<mca_bml_r2.num_btl_modules; i++) { if(mca_bml_r2.btl_modules[i] != btl) { modules[m++] = mca_bml_r2.btl_modules[i]; } } free(mca_bml_r2.btl_modules); mca_bml_r2.btl_modules = modules; mca_bml_r2.num_btl_modules = m; /* remove progress function so btl_progress isn't called on the failed BTL */ if(mca_bml_r2.num_btl_progress <= 1) { /* nothing left to send on! */ opal_output(0, "%s:%d:%s: only one BTL, can't fail-over!", __FILE__, __LINE__, __func__); return OMPI_ERROR; } /* figure out which progress functions to keep */ btl_progress_new = (mca_btl_base_component_progress_fn_t*) malloc(sizeof(mca_btl_base_component_progress_fn_t) * (mca_bml_r2.num_btl_progress - 1)); j = 0; for(i = 0; i < mca_bml_r2.num_btl_progress; i++) { if(btl->btl_component->btl_progress != mca_bml_r2.btl_progress[i]) { btl_progress_new[j] = mca_bml_r2.btl_progress[i]; j++; } } free(mca_bml_r2.btl_progress); mca_bml_r2.btl_progress = btl_progress_new; mca_bml_r2.num_btl_progress--; /* cleanup */ btl->btl_finalize(btl); free(procs); return OMPI_SUCCESS; }