void pmix_errhandler_invoke(pmix_status_t status, pmix_proc_t procs[], size_t nprocs, pmix_info_t info[], size_t ninfo) { /* We need to parse thru each registered handler and determine which one to call for the specific error */ int matched_errregs[PMIX_MAX_ERROR_REGISTRATIONS]; int i, nmatched = 0; unsigned int j,k; bool exact_match = false; int allerrhandler_ind = -1; pmix_error_reg_info_t *errreg; for (i = 0; i < pmix_pointer_array_get_size(&pmix_globals.errregs) && !exact_match; i++) { errreg = (pmix_error_reg_info_t*) pmix_pointer_array_get_item (&pmix_globals.errregs, i); if(0 == errreg->ninfo) { // this is a general err handler we will call it if there is no better match allerrhandler_ind = i; } else { /* match error name key first */ for(j = 0; j < errreg->ninfo; j++) { if ((0 == strcmp(errreg->info[j].key, PMIX_ERROR_NAME)) && (status == errreg->info[j].value.data.int32)) { matched_errregs[0] = i; nmatched = 1; exact_match = true; break; } else { for (k = 0; k < errreg->ninfo; k++) { if ((0 == strcmp(errreg->info[j].key, info[k].key)) && (pmix_value_cmp(&errreg->info[j].value, &info[k].value))) { matched_errregs[nmatched++] = 1; break; } } } } } } for ( i =0 ;i < nmatched; i++) { errreg = (pmix_error_reg_info_t*) pmix_pointer_array_get_item (&pmix_globals.errregs, matched_errregs[i]); errreg->errhandler (status, procs, nprocs, info, ninfo); } if ( 0 == nmatched && 0 <= allerrhandler_ind) { errreg = (pmix_error_reg_info_t*) pmix_pointer_array_get_item (&pmix_globals.errregs, allerrhandler_ind); errreg->errhandler (status, procs, nprocs, info, ninfo); } }
pmix_status_t pmix_lookup_errhandler(pmix_notification_fn_t err, int *index) { int i; pmix_status_t rc = PMIX_ERR_NOT_FOUND; pmix_error_reg_info_t *errreg; for (i = 0; i < pmix_pointer_array_get_size(&pmix_globals.errregs) ; i++) { errreg = (pmix_error_reg_info_t*) pmix_pointer_array_get_item (&pmix_globals.errregs, i); if(err == errreg->errhandler) { *index = i; rc = PMIX_SUCCESS; break; } } return rc; }
int pmix_mca_base_var_group_finalize (void) { pmix_object_t *object; int size, i; if (pmix_mca_base_var_group_initialized) { size = pmix_pointer_array_get_size(&pmix_mca_base_var_groups); for (i = 0 ; i < size ; ++i) { object = pmix_pointer_array_get_item (&pmix_mca_base_var_groups, i); if (NULL != object) { PMIX_RELEASE(object); } } PMIX_DESTRUCT(&pmix_mca_base_var_groups); PMIX_DESTRUCT(&pmix_mca_base_var_group_index_hash); pmix_mca_base_var_group_count = 0; pmix_mca_base_var_group_initialized = false; } return PMIX_SUCCESS; }
pmix_status_t pmix_bfrop_close(void) { int32_t i; if (!pmix_bfrop_initialized) { return PMIX_SUCCESS; } pmix_bfrop_initialized = false; for (i = 0 ; i < pmix_pointer_array_get_size(&pmix_bfrop_types) ; ++i) { pmix_bfrop_type_info_t *info = (pmix_bfrop_type_info_t*)pmix_pointer_array_get_item(&pmix_bfrop_types, i); if (NULL != info) { pmix_pointer_array_set_item(&pmix_bfrop_types, i, NULL); PMIX_RELEASE(info); } } PMIX_DESTRUCT(&pmix_bfrop_types); return PMIX_SUCCESS; }