From a5b95a093984d6168a6b5e344c0852e4dedd4efd Mon Sep 17 00:00:00 2001 From: Ralph Castain Date: Thu, 24 Dec 2015 17:14:26 -0800 Subject: [PATCH] Continue work on error notification system --- .../pmix120/pmix/src/server/pmix_server.c | 25 ++---- opal/mca/pmix/pmix120/pmix/src/util/error.c | 80 +++++++++++-------- 2 files changed, 55 insertions(+), 50 deletions(-) diff --git a/opal/mca/pmix/pmix120/pmix/src/server/pmix_server.c b/opal/mca/pmix/pmix120/pmix/src/server/pmix_server.c index 9b4e805b2f..af1fe50a76 100644 --- a/opal/mca/pmix/pmix120/pmix/src/server/pmix_server.c +++ b/opal/mca/pmix/pmix120/pmix/src/server/pmix_server.c @@ -626,9 +626,7 @@ pmix_status_t PMIx_server_register_nspace(const char nspace[], int nlocalprocs, /* we have to push this into our event library to avoid * potential threading issues */ - event_assign(&cd->ev, pmix_globals.evbase, -1, - EV_WRITE, _register_nspace, cd); - event_active(&cd->ev, EV_WRITE, 1); + PMIX_THREADSHIFT(cd, _register_nspace); return PMIX_SUCCESS; } @@ -666,9 +664,7 @@ void PMIx_server_deregister_nspace(const char nspace[]) /* we have to push this into our event library to avoid * potential threading issues */ - event_assign(&cd->ev, pmix_globals.evbase, -1, - EV_WRITE, _deregister_nspace, cd); - event_active(&cd->ev, EV_WRITE, 1); + PMIX_THREADSHIFT(cd, _deregister_nspace); } static void _execute_collective(int sd, short args, void *cbdata) @@ -847,9 +843,7 @@ pmix_status_t PMIx_server_register_client(const pmix_proc_t *proc, /* we have to push this into our event library to avoid * potential threading issues */ - event_assign(&cd->ev, pmix_globals.evbase, -1, - EV_WRITE, _register_client, cd); - event_active(&cd->ev, EV_WRITE, 1); + PMIX_THREADSHIFT(cd, _register_client); return PMIX_SUCCESS; } @@ -902,9 +896,7 @@ void PMIx_server_deregister_client(const pmix_proc_t *proc) /* we have to push this into our event library to avoid * potential threading issues */ - event_assign(&cd->ev, pmix_globals.evbase, -1, - EV_WRITE, _deregister_client, cd); - event_active(&cd->ev, EV_WRITE, 1); + PMIX_THREADSHIFT(cd, _deregister_client); } /* setup the envars for a child process */ @@ -1049,9 +1041,8 @@ pmix_status_t PMIx_server_dmodex_request(const pmix_proc_t *proc, /* we have to push this into our event library to avoid * potential threading issues */ - event_assign(&cd->ev, pmix_globals.evbase, -1, - EV_WRITE, _dmodex_req, cd); - event_active(&cd->ev, EV_WRITE, 1); + PMIX_THREADSHIFT(cd, _dmodex_req); + PMIX_WAIT_FOR_COMPLETION(cd->active); PMIX_RELEASE(cd); return PMIX_SUCCESS; @@ -1227,9 +1218,7 @@ pmix_status_t pmix_server_notify_error(pmix_status_t status, /* we have to push this into our event library to avoid * potential threading issues */ - event_assign(&cd->ev, pmix_globals.evbase, -1, - EV_WRITE, _notify_error, cd); - event_active(&cd->ev, EV_WRITE, 1); + PMIX_THREADSHIFT(cd, _notify_error); return PMIX_SUCCESS; } diff --git a/opal/mca/pmix/pmix120/pmix/src/util/error.c b/opal/mca/pmix/pmix120/pmix/src/util/error.c index bc6b2c2a3d..d632d571c2 100644 --- a/opal/mca/pmix/pmix120/pmix/src/util/error.c +++ b/opal/mca/pmix/pmix120/pmix/src/util/error.c @@ -152,51 +152,67 @@ void pmix_errhandler_invoke(pmix_status_t status, pmix_proc_t procs[], size_t nprocs, pmix_info_t info[], size_t ninfo) { -#if 0 /* We need to parse thru each registered handler and determine * which one to call for the specific error */ - int i; + int i, idflt; size_t j, k; - bool exact_match = false; + bool fired = false; + bool exact_match; int allerrhandler_ind = -1; - pmix_error_reg_info_t *errreg; + pmix_error_reg_info_t *errreg, *errdflt=NULL; + pmix_info_t *iptr; - for (i = 0; i < pmix_globals.errregs.size && !exact_match; i++) { + PMIX_INFO_CREATE(iptr, ninfo+1); + (void)strncpy(iptr[0].key, PMIX_ERROR_HANDLER_ID, PMIX_MAX_KEYLEN); + iptr[0].value.type = PMIX_INT; + for (j=0; j < ninfo; j++) { + PMIX_INFO_LOAD(&iptr[j+1], info[j].key, &info[j].value.data, info[j].value.type); + } + + for (i = 0; i < pmix_globals.errregs.size; i++) { if (NULL == (errreg = (pmix_error_reg_info_t*) pmix_pointer_array_get_item(&pmix_globals.errregs, i))) { continue; } - 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)) { - 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))) { - break; - } - } + if (NULL == errreg->info || 0 == errreg->ninfo) { + // this is a general err handler - we will call it if there is no better match + errdflt = errreg; + idflt = i; + continue; + } + iptr[0].value.data.integer = i; + /* match error name key first */ + exact_match = false; + for (j = 0; j < errreg->ninfo; j++) { + if ((0 == strcmp(errreg->info[j].key, PMIX_ERROR_NAME)) && + (status == errreg->info[j].value.data.int32)) { + iptr[0].value.data.integer = i; + errreg->errhandler(status, procs, nprocs, iptr, ninfo+1); + fired = true; + exact_match = true; + break; + } + } + if (!exact_match) { + /* if no exact match was found, then we will fire the errhandler + * for any matching info key. This may be too lax and need to be adjusted + * later */ + 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))) { + errreg->errhandler(status, procs, nprocs, iptr, ninfo+1); + fired = true; } } } } - 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 nothing fired and we found a general err handler, then fire it */ + if (!fired && NULL != errdflt) { + iptr[0].value.data.integer = idflt; + errdflt->errhandler(status, procs, nprocs, iptr, ninfo+1); } - 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); - } -#endif + /* cleanup */ + PMIX_INFO_FREE(iptr, ninfo+1); } pmix_status_t pmix_lookup_errhandler(pmix_notification_fn_t err,