diff --git a/opal/mca/pmix/ext2x/Makefile.am b/opal/mca/pmix/ext2x/Makefile.am index f78d09547f..4e161c28a7 100644 --- a/opal/mca/pmix/ext2x/Makefile.am +++ b/opal/mca/pmix/ext2x/Makefile.am @@ -14,12 +14,17 @@ dist_opaldata_DATA = help-pmix-ext2x.txt sources = \ - pmix2x.h \ - pmix2x_component.c \ - pmix2x.c \ - pmix2x_client.c \ - pmix2x_server_south.c \ - pmix2x_server_north.c + ext2x_local.c + +nodist_headers = \ + ext2x.h + +nodist_sources = \ + ext2x.c \ + ext2x_client.c \ + ext2x_component.c \ + ext2x_server_north.c \ + ext2x_server_south.c # Make the output library in this directory, and name it either # mca__.la (for DSO builds) or libmca__.la @@ -33,9 +38,23 @@ component_noinst = libmca_pmix_ext2x.la component_install = endif +# +# Generate ext2x sources from the pmix2x component +# +$(nodist_headers): + pmix2xname=`echo $@ | sed -e s/ext2x/pmix2x/g` ; \ + $(SED) 's/pmix2x/ext2x/g' $(top_srcdir)/opal/mca/pmix/pmix2x/$$pmix2xname > $@ + +$(sources): $(nodist_headers) + +$(nodist_sources): $(nodist_headers) + pmix2xname=`echo $@ | sed -e s/ext2x/pmix2x/g` ; \ + $(SED) 's/pmix2x/ext2x/g' $(top_srcdir)/opal/mca/pmix/pmix2x/$$pmix2xname > $@ + mcacomponentdir = $(opallibdir) mcacomponent_LTLIBRARIES = $(component_install) mca_pmix_ext2x_la_SOURCES = $(sources) +nodist_mca_pmix_ext2x_la_SOURCES = $(nodist_sources) mca_pmix_ext2x_la_CFLAGS = $(opal_pmix_ext2x_CFLAGS) mca_pmix_ext2x_la_CPPFLAGS =$(opal_pmix_ext2x_CPPFLAGS) mca_pmix_ext2x_la_LDFLAGS = -module -avoid-version $(opal_pmix_ext2x_LDFLAGS) @@ -48,3 +67,6 @@ libmca_pmix_ext2x_la_CFLAGS = $(opal_pmix_ext2x_CFLAGS) libmca_pmix_ext2x_la_CPPFLAGS = $(opal_pmix_ext2x_CPPFLAGS) libmca_pmix_ext2x_la_LDFLAGS = -module -avoid-version $(opal_pmix_ext2x_LDFLAGS) libmca_pmix_ext2x_la_LIBADD = $(opal_pmix_ext2x_LIBS) + +clean-local: + $(RM) -f $(nodist_sources) $(nodist_headers) diff --git a/opal/mca/pmix/ext2x/ext2x_local.c b/opal/mca/pmix/ext2x/ext2x_local.c new file mode 100644 index 0000000000..0c7e907468 --- /dev/null +++ b/opal/mca/pmix/ext2x/ext2x_local.c @@ -0,0 +1,27 @@ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */ +/* + * Copyright (c) 2014-2017 Intel, Inc. All rights reserved. + * Copyright (c) 2014-2017 Research Organization for Information Science + * and Technology (RIST). All rights reserved. + * Copyright (c) 2014-2015 Mellanox Technologies, Inc. + * All rights reserved. + * Copyright (c) 2016 Cisco Systems, Inc. All rights reserved. + * Copyright (c) 2017 Los Alamos National Security, LLC. All rights + * reserved. + * $COPYRIGHT$ + * + * Additional copyrights may follow + * + * $HEADER$ + */ + +#include "opal_config.h" +#include "opal/constants.h" + +#include "ext2x.h" + +int opal_pmix_ext2x_check_evars(void) +{ + /* a dummy function */ + return OPAL_SUCCESS; +} diff --git a/opal/mca/pmix/ext2x/pmix2x.c b/opal/mca/pmix/ext2x/pmix2x.c deleted file mode 100644 index 9854a002ea..0000000000 --- a/opal/mca/pmix/ext2x/pmix2x.c +++ /dev/null @@ -1,1543 +0,0 @@ -/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */ -/* - * Copyright (c) 2014-2017 Intel, Inc. All rights reserved. - * Copyright (c) 2014-2017 Research Organization for Information Science - * and Technology (RIST). All rights reserved. - * Copyright (c) 2014-2015 Mellanox Technologies, Inc. - * All rights reserved. - * Copyright (c) 2016 Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2017 Los Alamos National Security, LLC. All rights - * reserved. - * $COPYRIGHT$ - * - * Additional copyrights may follow - * - * $HEADER$ - */ - -#include "opal_config.h" -#include "opal/constants.h" -#include "opal/types.h" - -#ifdef HAVE_STRING_H -#include -#endif -#ifdef HAVE_UNISTD_H -#include -#endif - -#include "opal/dss/dss.h" -#include "opal/mca/event/event.h" -#include "opal/mca/hwloc/base/base.h" -#include "opal/runtime/opal.h" -#include "opal/runtime/opal_progress_threads.h" -#include "opal/threads/threads.h" -#include "opal/util/argv.h" -#include "opal/util/error.h" -#include "opal/util/opal_environ.h" -#include "opal/util/output.h" -#include "opal/util/proc.h" -#include "opal/util/show_help.h" - -#include "pmix2x.h" -#include "opal/mca/pmix/base/base.h" -#include "opal/mca/pmix/pmix_types.h" - -#include -#include - -/**** C.O.M.M.O.N I.N.T.E.R.F.A.C.E.S ****/ - -/* These are functions used by both client and server to - * access common functions in the embedded PMIx library */ - -static const char *ext2x_get_nspace(opal_jobid_t jobid); -static void ext2x_register_jobid(opal_jobid_t jobid, const char *nspace); -static void register_handler(opal_list_t *event_codes, - opal_list_t *info, - opal_pmix_notification_fn_t evhandler, - opal_pmix_evhandler_reg_cbfunc_t cbfunc, - void *cbdata); -static void deregister_handler(size_t evhandler, - opal_pmix_op_cbfunc_t cbfunc, - void *cbdata); -static int notify_event(int status, - const opal_process_name_t *source, - opal_pmix_data_range_t range, - opal_list_t *info, - opal_pmix_op_cbfunc_t cbfunc, void *cbdata); -static void ext2x_query(opal_list_t *queries, - opal_pmix_info_cbfunc_t cbfunc, void *cbdata); -static void ext2x_log(opal_list_t *info, - opal_pmix_op_cbfunc_t cbfunc, void *cbdata); - -const opal_pmix_base_module_t opal_pmix_ext2x_module = { - /* client APIs */ - .init = ext2x_client_init, - .finalize = ext2x_client_finalize, - .initialized = ext2x_initialized, - .abort = ext2x_abort, - .commit = ext2x_commit, - .fence = ext2x_fence, - .fence_nb = ext2x_fencenb, - .put = ext2x_put, - .get = ext2x_get, - .get_nb = ext2x_getnb, - .publish = ext2x_publish, - .publish_nb = ext2x_publishnb, - .lookup = ext2x_lookup, - .lookup_nb = ext2x_lookupnb, - .unpublish = ext2x_unpublish, - .unpublish_nb = ext2x_unpublishnb, - .spawn = ext2x_spawn, - .spawn_nb = ext2x_spawnnb, - .connect = ext2x_connect, - .connect_nb = ext2x_connectnb, - .disconnect = ext2x_disconnect, - .disconnect_nb = ext2x_disconnectnb, - .resolve_peers = ext2x_resolve_peers, - .resolve_nodes = ext2x_resolve_nodes, - .query = ext2x_query, - .log = ext2x_log, - /* server APIs */ - .server_init = ext2x_server_init, - .server_finalize = ext2x_server_finalize, - .generate_regex = ext2x_server_gen_regex, - .generate_ppn = ext2x_server_gen_ppn, - .server_register_nspace = ext2x_server_register_nspace, - .server_deregister_nspace = ext2x_server_deregister_nspace, - .server_register_client = ext2x_server_register_client, - .server_deregister_client = ext2x_server_deregister_client, - .server_setup_fork = ext2x_server_setup_fork, - .server_dmodex_request = ext2x_server_dmodex, - .server_notify_event = ext2x_server_notify_event, - /* tool APIs */ - .tool_init = ext2x_tool_init, - .tool_finalize = ext2x_tool_fini, - /* utility APIs */ - .get_version = PMIx_Get_version, - .register_evhandler = register_handler, - .deregister_evhandler = deregister_handler, - .notify_event = notify_event, - .store_local = ext2x_store_local, - .get_nspace = ext2x_get_nspace, - .register_jobid = ext2x_register_jobid -}; - -static void opcbfunc(pmix_status_t status, void *cbdata) -{ - ext2x_opcaddy_t *op = (ext2x_opcaddy_t*)cbdata; - - OPAL_ACQUIRE_OBJECT(op); - - if (NULL != op->opcbfunc) { - op->opcbfunc(ext2x_convert_rc(status), op->cbdata); - } - OBJ_RELEASE(op); -} - - -static const char *ext2x_get_nspace(opal_jobid_t jobid) -{ - opal_ext2x_jobid_trkr_t *jptr; - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - - OPAL_LIST_FOREACH(jptr, &mca_pmix_ext2x_component.jobids, opal_ext2x_jobid_trkr_t) { - if (jptr->jobid == jobid) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return jptr->nspace; - } - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return NULL; -} - -static void ext2x_register_jobid(opal_jobid_t jobid, const char *nspace) -{ - opal_ext2x_jobid_trkr_t *jptr; - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - - /* if we don't already have it, add this to our jobid tracker */ - OPAL_LIST_FOREACH(jptr, &mca_pmix_ext2x_component.jobids, opal_ext2x_jobid_trkr_t) { - if (jptr->jobid == jobid) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return; - } - } - jptr = OBJ_NEW(opal_ext2x_jobid_trkr_t); - (void)strncpy(jptr->nspace, nspace, PMIX_MAX_NSLEN); - jptr->jobid = jobid; - opal_list_append(&mca_pmix_ext2x_component.jobids, &jptr->super); - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); -} - -static void event_hdlr_complete(pmix_status_t status, void *cbdata) -{ - ext2x_opcaddy_t *op = (ext2x_opcaddy_t*)cbdata; - - OBJ_RELEASE(op); -} - -static void return_local_event_hdlr(int status, opal_list_t *results, - opal_pmix_op_cbfunc_t cbfunc, void *thiscbdata, - void *notification_cbdata) -{ - ext2x_threadshift_t *cd = (ext2x_threadshift_t*)notification_cbdata; - ext2x_opcaddy_t *op; - opal_value_t *kv; - pmix_status_t pstatus; - size_t n; - - OPAL_ACQUIRE_OBJECT(cd); - if (NULL != cd->pmixcbfunc) { - op = OBJ_NEW(ext2x_opcaddy_t); - - if (NULL != results) { - /* convert the list of results to an array of info */ - op->ninfo = opal_list_get_size(results); - if (0 < op->ninfo) { - PMIX_INFO_CREATE(op->info, op->ninfo); - n=0; - OPAL_LIST_FOREACH(kv, cd->info, opal_value_t) { - (void)strncpy(op->info[n].key, kv->key, PMIX_MAX_KEYLEN); - ext2x_value_load(&op->info[n].value, kv); - ++n; - } - } - } - /* convert the status */ - pstatus = ext2x_convert_opalrc(status); - /* call the library's callback function */ - cd->pmixcbfunc(pstatus, op->info, op->ninfo, event_hdlr_complete, op, cd->cbdata); - } - - /* release the threadshift object */ - if (NULL != cd->info) { - OPAL_LIST_RELEASE(cd->info); - } - OBJ_RELEASE(cd); - - /* release the caller */ - if (NULL != cbfunc) { - cbfunc(OPAL_SUCCESS, thiscbdata); - } -} - -/* this function will be called by the PMIx client library - * whenever it receives notification of an event. The - * notification can come from an ORTE daemon (when launched - * by mpirun), directly from a RM (when direct launched), or - * from another process (via the local daemon). - * The call will occur in the PMIx event base */ -void ext2x_event_hdlr(size_t evhdlr_registration_id, - pmix_status_t status, const pmix_proc_t *source, - pmix_info_t info[], size_t ninfo, - pmix_info_t results[], size_t nresults, - pmix_event_notification_cbfunc_fn_t cbfunc, - void *cbdata) -{ - ext2x_threadshift_t *cd; - int rc; - opal_value_t *iptr; - size_t n; - opal_ext2x_event_t *event; - - opal_output_verbose(2, opal_pmix_base_framework.framework_output, - "%s RECEIVED NOTIFICATION OF STATUS %d", - OPAL_NAME_PRINT(OPAL_PROC_MY_NAME), status); - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - - cd = OBJ_NEW(ext2x_threadshift_t); - cd->id = evhdlr_registration_id; - cd->pmixcbfunc = cbfunc; - cd->cbdata = cbdata; - - /* convert the incoming status */ - cd->status = ext2x_convert_rc(status); - opal_output_verbose(2, opal_pmix_base_framework.framework_output, - "%s CONVERTED STATUS %d TO STATUS %d", - OPAL_NAME_PRINT(OPAL_PROC_MY_NAME), status, cd->status); - - /* convert the nspace/rank to an opal_process_name_t */ - if (NULL == source) { - cd->pname.jobid = OPAL_NAME_INVALID->jobid; - cd->pname.vpid = OPAL_NAME_INVALID->vpid; - } else { - if (OPAL_SUCCESS != (rc = opal_convert_string_to_jobid(&cd->pname.jobid, source->nspace))) { - OPAL_ERROR_LOG(rc); - OBJ_RELEASE(cd); - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return; - } - cd->pname.vpid = ext2x_convert_rank(source->rank); - } - - /* convert the array of info */ - if (NULL != info) { - cd->info = OBJ_NEW(opal_list_t); - for (n=0; n < ninfo; n++) { - iptr = OBJ_NEW(opal_value_t); - iptr->key = strdup(info[n].key); - if (OPAL_SUCCESS != (rc = ext2x_value_unload(iptr, &info[n].value))) { - OPAL_ERROR_LOG(rc); - OBJ_RELEASE(iptr); - continue; - } - opal_list_append(cd->info, &iptr->super); - } - } - - /* convert the array of prior results */ - if (NULL != results) { - for (n=0; n < nresults; n++) { - iptr = OBJ_NEW(opal_value_t); - iptr->key = strdup(results[n].key); - if (OPAL_SUCCESS != (rc = ext2x_value_unload(iptr, &results[n].value))) { - OPAL_ERROR_LOG(rc); - OBJ_RELEASE(iptr); - continue; - } - opal_list_append(&cd->results, &iptr->super); - } - } - - /* cycle thru the registrations */ - OPAL_LIST_FOREACH(event, &mca_pmix_ext2x_component.events, opal_ext2x_event_t) { - if (evhdlr_registration_id == event->index) { - /* found it - invoke the handler, pointing its - * callback function to our callback function */ - opal_output_verbose(2, opal_pmix_base_framework.framework_output, - "%s _EVENT_HDLR CALLING EVHDLR", - OPAL_NAME_PRINT(OPAL_PROC_MY_NAME)); - if (NULL != event->handler) { - OBJ_RETAIN(event); - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - event->handler(cd->status, &cd->pname, - cd->info, &cd->results, - return_local_event_hdlr, cd); - OBJ_RELEASE(event); - return; - } - } - } - - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - /* if we didn't find a match, we still have to call their final callback */ - if (NULL != cbfunc) { - cbfunc(PMIX_SUCCESS, NULL, 0, NULL, NULL, cbdata); - } - OPAL_LIST_RELEASE(cd->info); - OBJ_RELEASE(cd); - return; -} - -opal_vpid_t ext2x_convert_rank(pmix_rank_t rank) -{ - switch(rank) { - case PMIX_RANK_UNDEF: - return OPAL_VPID_INVALID; - case PMIX_RANK_WILDCARD: - return OPAL_VPID_WILDCARD; - default: - return (opal_vpid_t)rank; - } -} - -pmix_rank_t ext2x_convert_opalrank(opal_vpid_t vpid) -{ - switch(vpid) { - case OPAL_VPID_WILDCARD: - return PMIX_RANK_WILDCARD; - case OPAL_VPID_INVALID: - return PMIX_RANK_UNDEF; - default: - return (pmix_rank_t)vpid; - } -} - -pmix_status_t ext2x_convert_opalrc(int rc) -{ - switch (rc) { - case OPAL_ERR_DEBUGGER_RELEASE: - return PMIX_ERR_DEBUGGER_RELEASE; - - case OPAL_ERR_HANDLERS_COMPLETE: - return PMIX_EVENT_ACTION_COMPLETE; - - case OPAL_ERR_PROC_ABORTED: - return PMIX_ERR_PROC_ABORTED; - - case OPAL_ERR_PROC_REQUESTED_ABORT: - return PMIX_ERR_PROC_REQUESTED_ABORT; - - case OPAL_ERR_PROC_ABORTING: - return PMIX_ERR_PROC_ABORTING; - - case OPAL_ERR_NODE_DOWN: - return PMIX_ERR_NODE_DOWN; - - case OPAL_ERR_NODE_OFFLINE: - return PMIX_ERR_NODE_OFFLINE; - - case OPAL_ERR_JOB_TERMINATED: - return PMIX_ERR_JOB_TERMINATED; - - case OPAL_ERR_PROC_RESTART: - return PMIX_ERR_PROC_RESTART; - - case OPAL_ERR_PROC_CHECKPOINT: - return PMIX_ERR_PROC_CHECKPOINT; - - case OPAL_ERR_PROC_MIGRATE: - return PMIX_ERR_PROC_MIGRATE; - - case OPAL_ERR_EVENT_REGISTRATION: - return PMIX_ERR_EVENT_REGISTRATION; - - case OPAL_ERR_NOT_IMPLEMENTED: - case OPAL_ERR_NOT_SUPPORTED: - return PMIX_ERR_NOT_SUPPORTED; - - case OPAL_ERR_NOT_FOUND: - return PMIX_ERR_NOT_FOUND; - - case OPAL_ERR_PERM: - case OPAL_ERR_UNREACH: - case OPAL_ERR_SERVER_NOT_AVAIL: - return PMIX_ERR_UNREACH; - - case OPAL_ERR_BAD_PARAM: - return PMIX_ERR_BAD_PARAM; - - case OPAL_ERR_OUT_OF_RESOURCE: - return PMIX_ERR_OUT_OF_RESOURCE; - - case OPAL_ERR_DATA_VALUE_NOT_FOUND: - return PMIX_ERR_DATA_VALUE_NOT_FOUND; - - case OPAL_ERR_TIMEOUT: - return PMIX_ERR_TIMEOUT; - - case OPAL_ERR_WOULD_BLOCK: - return PMIX_ERR_WOULD_BLOCK; - - case OPAL_EXISTS: - return PMIX_EXISTS; - - case OPAL_ERR_PARTIAL_SUCCESS: - return PMIX_QUERY_PARTIAL_SUCCESS; - - case OPAL_ERR_MODEL_DECLARED: - return PMIX_MODEL_DECLARED; - - case OPAL_ERROR: - return PMIX_ERROR; - case OPAL_SUCCESS: - return PMIX_SUCCESS; - default: - return rc; - } -} - -int ext2x_convert_rc(pmix_status_t rc) -{ - switch (rc) { - case PMIX_ERR_DEBUGGER_RELEASE: - return OPAL_ERR_DEBUGGER_RELEASE; - - case PMIX_EVENT_ACTION_COMPLETE: - return OPAL_ERR_HANDLERS_COMPLETE; - - case PMIX_ERR_PROC_ABORTED: - return OPAL_ERR_PROC_ABORTED; - - case PMIX_ERR_PROC_REQUESTED_ABORT: - return OPAL_ERR_PROC_REQUESTED_ABORT; - - case PMIX_ERR_PROC_ABORTING: - return OPAL_ERR_PROC_ABORTING; - - case PMIX_ERR_NODE_DOWN: - return OPAL_ERR_NODE_DOWN; - - case PMIX_ERR_NODE_OFFLINE: - return OPAL_ERR_NODE_OFFLINE; - - case PMIX_ERR_JOB_TERMINATED: - return OPAL_ERR_JOB_TERMINATED; - - case PMIX_ERR_PROC_RESTART: - return OPAL_ERR_PROC_RESTART; - - case PMIX_ERR_PROC_CHECKPOINT: - return OPAL_ERR_PROC_CHECKPOINT; - - case PMIX_ERR_PROC_MIGRATE: - return OPAL_ERR_PROC_MIGRATE; - - case PMIX_ERR_EVENT_REGISTRATION: - return OPAL_ERR_EVENT_REGISTRATION; - - case PMIX_ERR_NOT_SUPPORTED: - return OPAL_ERR_NOT_SUPPORTED; - - case PMIX_ERR_NOT_FOUND: - return OPAL_ERR_NOT_FOUND; - - case PMIX_ERR_OUT_OF_RESOURCE: - return OPAL_ERR_OUT_OF_RESOURCE; - - case PMIX_ERR_INIT: - return OPAL_ERROR; - - case PMIX_ERR_BAD_PARAM: - return OPAL_ERR_BAD_PARAM; - - case PMIX_ERR_UNREACH: - case PMIX_ERR_NO_PERMISSIONS: - return OPAL_ERR_UNREACH; - - case PMIX_ERR_TIMEOUT: - return OPAL_ERR_TIMEOUT; - - case PMIX_ERR_WOULD_BLOCK: - return OPAL_ERR_WOULD_BLOCK; - - case PMIX_ERR_LOST_CONNECTION_TO_SERVER: - case PMIX_ERR_LOST_PEER_CONNECTION: - case PMIX_ERR_LOST_CONNECTION_TO_CLIENT: - return OPAL_ERR_COMM_FAILURE; - - case PMIX_EXISTS: - return OPAL_EXISTS; - - case PMIX_QUERY_PARTIAL_SUCCESS: - return OPAL_ERR_PARTIAL_SUCCESS; - - case PMIX_MONITOR_HEARTBEAT_ALERT: - return OPAL_ERR_HEARTBEAT_ALERT; - - case PMIX_MONITOR_FILE_ALERT: - return OPAL_ERR_FILE_ALERT; - - case PMIX_MODEL_DECLARED: - return OPAL_ERR_MODEL_DECLARED; - - - case PMIX_ERROR: - return OPAL_ERROR; - case PMIX_SUCCESS: - return OPAL_SUCCESS; - default: - return rc; - } -} - -opal_pmix_scope_t ext2x_convert_scope(pmix_scope_t scope) -{ - switch(scope) { - case PMIX_SCOPE_UNDEF: - return OPAL_PMIX_SCOPE_UNDEF; - case PMIX_LOCAL: - return OPAL_PMIX_LOCAL; - case PMIX_REMOTE: - return OPAL_PMIX_REMOTE; - case PMIX_GLOBAL: - return OPAL_PMIX_GLOBAL; - default: - return OPAL_PMIX_SCOPE_UNDEF; - } -} - -pmix_scope_t ext2x_convert_opalscope(opal_pmix_scope_t scope) { - switch(scope) { - case OPAL_PMIX_LOCAL: - return PMIX_LOCAL; - case OPAL_PMIX_REMOTE: - return PMIX_REMOTE; - case OPAL_PMIX_GLOBAL: - return PMIX_GLOBAL; - default: - return PMIX_SCOPE_UNDEF; - } -} - -pmix_data_range_t ext2x_convert_opalrange(opal_pmix_data_range_t range) { - switch(range) { - case OPAL_PMIX_RANGE_UNDEF: - return PMIX_RANGE_UNDEF; - case OPAL_PMIX_RANGE_LOCAL: - return PMIX_RANGE_LOCAL; - case OPAL_PMIX_RANGE_NAMESPACE: - return PMIX_RANGE_NAMESPACE; - case OPAL_PMIX_RANGE_SESSION: - return PMIX_RANGE_SESSION; - case OPAL_PMIX_RANGE_GLOBAL: - return PMIX_RANGE_GLOBAL; - case OPAL_PMIX_RANGE_CUSTOM: - return PMIX_RANGE_CUSTOM; - default: - return PMIX_SCOPE_UNDEF; - } -} - -opal_pmix_data_range_t ext2x_convert_range(pmix_data_range_t range) { - switch(range) { - case PMIX_RANGE_UNDEF: - return OPAL_PMIX_RANGE_UNDEF; - case PMIX_RANGE_LOCAL: - return OPAL_PMIX_RANGE_LOCAL; - case PMIX_RANGE_NAMESPACE: - return OPAL_PMIX_RANGE_NAMESPACE; - case PMIX_RANGE_SESSION: - return OPAL_PMIX_RANGE_SESSION; - case PMIX_RANGE_GLOBAL: - return OPAL_PMIX_RANGE_GLOBAL; - case PMIX_RANGE_CUSTOM: - return OPAL_PMIX_RANGE_CUSTOM; - default: - return OPAL_PMIX_RANGE_UNDEF; - } -} - -opal_pmix_persistence_t ext2x_convert_persist(pmix_persistence_t persist) -{ - switch(persist) { - case PMIX_PERSIST_INDEF: - return OPAL_PMIX_PERSIST_INDEF; - case PMIX_PERSIST_FIRST_READ: - return OPAL_PMIX_PERSIST_FIRST_READ; - case PMIX_PERSIST_PROC: - return OPAL_PMIX_PERSIST_PROC; - case PMIX_PERSIST_APP: - return OPAL_PMIX_PERSIST_APP; - case PMIX_PERSIST_SESSION: - return OPAL_PMIX_PERSIST_SESSION; - default: - return OPAL_PMIX_PERSIST_INDEF; - } -} - -pmix_persistence_t ext2x_convert_opalpersist(opal_pmix_persistence_t persist) -{ - switch(persist) { - case OPAL_PMIX_PERSIST_INDEF: - return PMIX_PERSIST_INDEF; - case OPAL_PMIX_PERSIST_FIRST_READ: - return PMIX_PERSIST_FIRST_READ; - case OPAL_PMIX_PERSIST_PROC: - return PMIX_PERSIST_PROC; - case OPAL_PMIX_PERSIST_APP: - return PMIX_PERSIST_APP; - case OPAL_PMIX_PERSIST_SESSION: - return PMIX_PERSIST_SESSION; - default: - return PMIX_PERSIST_INDEF; - } -} - -char* ext2x_convert_jobid(opal_jobid_t jobid) -{ - opal_ext2x_jobid_trkr_t *jptr; - - /* look thru our list of jobids and find the - * corresponding nspace */ - OPAL_LIST_FOREACH(jptr, &mca_pmix_ext2x_component.jobids, opal_ext2x_jobid_trkr_t) { - if (jptr->jobid == jobid) { - return jptr->nspace; - } - } - return NULL; -} - -/**** RHC: NEED TO ADD SUPPORT FOR NEW PMIX DATA TYPES, INCLUDING - **** CONVERSION OF PROC STATES ****/ - -void ext2x_value_load(pmix_value_t *v, - opal_value_t *kv) -{ - opal_ext2x_jobid_trkr_t *job; - bool found; - opal_list_t *list; - opal_value_t *val; - pmix_info_t *info; - size_t n; - - switch(kv->type) { - case OPAL_UNDEF: - v->type = PMIX_UNDEF; - break; - case OPAL_BOOL: - v->type = PMIX_BOOL; - memcpy(&(v->data.flag), &kv->data.flag, 1); - break; - case OPAL_BYTE: - v->type = PMIX_BYTE; - memcpy(&(v->data.byte), &kv->data.byte, 1); - break; - case OPAL_STRING: - v->type = PMIX_STRING; - if (NULL != kv->data.string) { - v->data.string = strdup(kv->data.string); - } else { - v->data.string = NULL; - } - break; - case OPAL_SIZE: - v->type = PMIX_SIZE; - memcpy(&(v->data.size), &kv->data.size, sizeof(size_t)); - break; - case OPAL_PID: - v->type = PMIX_PID; - memcpy(&(v->data.pid), &kv->data.pid, sizeof(pid_t)); - break; - case OPAL_INT: - v->type = PMIX_INT; - memcpy(&(v->data.integer), &kv->data.integer, sizeof(int)); - break; - case OPAL_INT8: - v->type = PMIX_INT8; - memcpy(&(v->data.int8), &kv->data.int8, 1); - break; - case OPAL_INT16: - v->type = PMIX_INT16; - memcpy(&(v->data.int16), &kv->data.int16, 2); - break; - case OPAL_INT32: - v->type = PMIX_INT32; - memcpy(&(v->data.int32), &kv->data.int32, 4); - break; - case OPAL_INT64: - v->type = PMIX_INT64; - memcpy(&(v->data.int64), &kv->data.int64, 8); - break; - case OPAL_UINT: - v->type = PMIX_UINT; - memcpy(&(v->data.uint), &kv->data.uint, sizeof(int)); - break; - case OPAL_UINT8: - v->type = PMIX_UINT8; - memcpy(&(v->data.uint8), &kv->data.uint8, 1); - break; - case OPAL_UINT16: - v->type = PMIX_UINT16; - memcpy(&(v->data.uint16), &kv->data.uint16, 2); - break; - case OPAL_UINT32: - v->type = PMIX_UINT32; - memcpy(&(v->data.uint32), &kv->data.uint32, 4); - break; - case OPAL_UINT64: - v->type = PMIX_UINT64; - memcpy(&(v->data.uint64), &kv->data.uint64, 8); - break; - case OPAL_FLOAT: - v->type = PMIX_FLOAT; - memcpy(&(v->data.fval), &kv->data.fval, sizeof(float)); - break; - case OPAL_DOUBLE: - v->type = PMIX_DOUBLE; - memcpy(&(v->data.dval), &kv->data.dval, sizeof(double)); - break; - case OPAL_TIMEVAL: - v->type = PMIX_TIMEVAL; - memcpy(&(v->data.tv), &kv->data.tv, sizeof(struct timeval)); - break; - case OPAL_TIME: - v->type = PMIX_TIME; - memcpy(&(v->data.time), &kv->data.time, sizeof(time_t)); - break; - case OPAL_STATUS: - v->type = PMIX_STATUS; - memcpy(&(v->data.status), &kv->data.status, sizeof(pmix_status_t)); - break; - case OPAL_VPID: - v->type = PMIX_PROC_RANK; - v->data.rank = ext2x_convert_opalrank(kv->data.name.vpid); - break; - case OPAL_NAME: - v->type = PMIX_PROC; - /* have to stringify the jobid */ - PMIX_PROC_CREATE(v->data.proc, 1); - /* see if this job is in our list of known nspaces */ - found = false; - OPAL_LIST_FOREACH(job, &mca_pmix_ext2x_component.jobids, opal_ext2x_jobid_trkr_t) { - if (job->jobid == kv->data.name.jobid) { - (void)strncpy(v->data.proc->nspace, job->nspace, PMIX_MAX_NSLEN); - found = true; - break; - } - } - if (!found) { - (void)opal_snprintf_jobid(v->data.proc->nspace, PMIX_MAX_NSLEN, kv->data.name.vpid); - } - v->data.proc->rank = ext2x_convert_opalrank(kv->data.name.vpid); - break; - case OPAL_BYTE_OBJECT: - v->type = PMIX_BYTE_OBJECT; - if (NULL != kv->data.bo.bytes) { - v->data.bo.bytes = (char*)malloc(kv->data.bo.size); - memcpy(v->data.bo.bytes, kv->data.bo.bytes, kv->data.bo.size); - v->data.bo.size = (size_t)kv->data.bo.size; - } else { - v->data.bo.bytes = NULL; - v->data.bo.size = 0; - } - break; - case OPAL_PERSIST: - v->type = PMIX_PERSIST; - v->data.persist = ext2x_convert_opalpersist((opal_pmix_persistence_t)kv->data.uint8); - break; - case OPAL_SCOPE: - v->type = PMIX_SCOPE; - v->data.scope = ext2x_convert_opalscope((opal_pmix_scope_t)kv->data.uint8); - break; - case OPAL_DATA_RANGE: - v->type = PMIX_DATA_RANGE; - v->data.range = ext2x_convert_opalrange((opal_pmix_data_range_t)kv->data.uint8); - break; - case OPAL_PROC_STATE: - v->type = PMIX_PROC_STATE; - /* the OPAL layer doesn't have any concept of proc state, - * so the ORTE layer is responsible for converting it */ - memcpy(&v->data.state, &kv->data.uint8, sizeof(uint8_t)); - break; - case OPAL_PTR: - /* if someone returned a pointer, it must be to a list of - * opal_value_t's that we need to convert to a pmix_data_array - * of pmix_info_t structures */ - list = (opal_list_t*)kv->data.ptr; - v->type = PMIX_DATA_ARRAY; - v->data.darray = (pmix_data_array_t*)malloc(sizeof(pmix_data_array_t)); - v->data.darray->type = PMIX_INFO; - v->data.darray->size = opal_list_get_size(list); - PMIX_INFO_CREATE(info, v->data.darray->size); - v->data.darray->array = info; - n=0; - OPAL_LIST_FOREACH(val, list, opal_value_t) { - (void)strncpy(info[n].key, val->key, PMIX_MAX_KEYLEN); - ext2x_value_load(&info[n].value, val); - ++n; - } - break; - default: - /* silence warnings */ - break; - } -} - -int ext2x_value_unload(opal_value_t *kv, - const pmix_value_t *v) -{ - int rc=OPAL_SUCCESS; - bool found; - opal_ext2x_jobid_trkr_t *job; - opal_list_t *lt; - opal_value_t *ival; - size_t n; - - switch(v->type) { - case PMIX_UNDEF: - kv->type = OPAL_UNDEF; - break; - case PMIX_BOOL: - kv->type = OPAL_BOOL; - memcpy(&kv->data.flag, &(v->data.flag), 1); - break; - case PMIX_BYTE: - kv->type = OPAL_BYTE; - memcpy(&kv->data.byte, &(v->data.byte), 1); - break; - case PMIX_STRING: - kv->type = OPAL_STRING; - if (NULL != v->data.string) { - kv->data.string = strdup(v->data.string); - } - break; - case PMIX_SIZE: - kv->type = OPAL_SIZE; - memcpy(&kv->data.size, &(v->data.size), sizeof(size_t)); - break; - case PMIX_PID: - kv->type = OPAL_PID; - memcpy(&kv->data.pid, &(v->data.pid), sizeof(pid_t)); - break; - case PMIX_INT: - kv->type = OPAL_INT; - memcpy(&kv->data.integer, &(v->data.integer), sizeof(int)); - break; - case PMIX_INT8: - kv->type = OPAL_INT8; - memcpy(&kv->data.int8, &(v->data.int8), 1); - break; - case PMIX_INT16: - kv->type = OPAL_INT16; - memcpy(&kv->data.int16, &(v->data.int16), 2); - break; - case PMIX_INT32: - kv->type = OPAL_INT32; - memcpy(&kv->data.int32, &(v->data.int32), 4); - break; - case PMIX_INT64: - kv->type = OPAL_INT64; - memcpy(&kv->data.int64, &(v->data.int64), 8); - break; - case PMIX_UINT: - kv->type = OPAL_UINT; - memcpy(&kv->data.uint, &(v->data.uint), sizeof(int)); - break; - case PMIX_UINT8: - kv->type = OPAL_UINT8; - memcpy(&kv->data.uint8, &(v->data.uint8), 1); - break; - case PMIX_UINT16: - kv->type = OPAL_UINT16; - memcpy(&kv->data.uint16, &(v->data.uint16), 2); - break; - case PMIX_UINT32: - kv->type = OPAL_UINT32; - memcpy(&kv->data.uint32, &(v->data.uint32), 4); - break; - case PMIX_UINT64: - kv->type = OPAL_UINT64; - memcpy(&kv->data.uint64, &(v->data.uint64), 8); - break; - case PMIX_FLOAT: - kv->type = OPAL_FLOAT; - memcpy(&kv->data.fval, &(v->data.fval), sizeof(float)); - break; - case PMIX_DOUBLE: - kv->type = OPAL_DOUBLE; - memcpy(&kv->data.dval, &(v->data.dval), sizeof(double)); - break; - case PMIX_TIMEVAL: - kv->type = OPAL_TIMEVAL; - memcpy(&kv->data.tv, &(v->data.tv), sizeof(struct timeval)); - break; - case PMIX_TIME: - kv->type = OPAL_TIME; - memcpy(&kv->data.time, &(v->data.time), sizeof(time_t)); - break; - case PMIX_STATUS: - kv->type = OPAL_STATUS; - memcpy(&kv->data.status, &(v->data.status), sizeof(opal_status_t)); - break; - case PMIX_PROC_RANK: - kv->type = OPAL_VPID; - kv->data.name.vpid = ext2x_convert_rank(v->data.rank); - break; - case PMIX_PROC: - kv->type = OPAL_NAME; - /* see if this job is in our list of known nspaces */ - found = false; - OPAL_LIST_FOREACH(job, &mca_pmix_ext2x_component.jobids, opal_ext2x_jobid_trkr_t) { - if (0 == strncmp(job->nspace, v->data.proc->nspace, PMIX_MAX_NSLEN)) { - kv->data.name.jobid = job->jobid; - found = true; - break; - } - } - if (!found) { - if (OPAL_SUCCESS != (rc = opal_convert_string_to_jobid(&kv->data.name.jobid, v->data.proc->nspace))) { - return ext2x_convert_opalrc(rc); - } - } - kv->data.name.vpid = ext2x_convert_rank(v->data.proc->rank); - break; - case PMIX_BYTE_OBJECT: - kv->type = OPAL_BYTE_OBJECT; - if (NULL != v->data.bo.bytes && 0 < v->data.bo.size) { - kv->data.bo.bytes = (uint8_t*)malloc(v->data.bo.size); - memcpy(kv->data.bo.bytes, v->data.bo.bytes, v->data.bo.size); - kv->data.bo.size = (int)v->data.bo.size; - } else { - kv->data.bo.bytes = NULL; - kv->data.bo.size = 0; - } - break; - case PMIX_PERSIST: - kv->type = OPAL_PERSIST; - kv->data.uint8 = ext2x_convert_persist(v->data.persist); - break; - case PMIX_SCOPE: - kv->type = OPAL_SCOPE; - kv->data.uint8 = ext2x_convert_scope(v->data.scope); - break; - case PMIX_DATA_RANGE: - kv->type = OPAL_DATA_RANGE; - kv->data.uint8 = ext2x_convert_range(v->data.range); - break; - case PMIX_PROC_STATE: - kv->type = OPAL_PROC_STATE; - /* the OPAL layer doesn't have any concept of proc state, - * so the ORTE layer is responsible for converting it */ - memcpy(&kv->data.uint8, &v->data.state, sizeof(uint8_t)); - break; - case PMIX_POINTER: - kv->type = OPAL_PTR; - kv->data.ptr = v->data.ptr; - break; - case PMIX_DATA_ARRAY: - if (NULL == v->data.darray || NULL == v->data.darray->array) { - kv->data.ptr = NULL; - break; - } - lt = OBJ_NEW(opal_list_t); - kv->type = OPAL_PTR; - kv->data.ptr = (void*)lt; - for (n=0; n < v->data.darray->size; n++) { - ival = OBJ_NEW(opal_value_t); - opal_list_append(lt, &ival->super); - /* handle the various types */ - if (PMIX_INFO == v->data.darray->type) { - pmix_info_t *iptr = (pmix_info_t*)v->data.darray->array; - ival->key = strdup(iptr[n].key); - rc = ext2x_value_unload(ival, &iptr[n].value); - if (OPAL_SUCCESS != rc) { - OPAL_LIST_RELEASE(lt); - kv->type = OPAL_UNDEF; - kv->data.ptr = NULL; - break; - } - } - } - break; - default: - /* silence warnings */ - rc = OPAL_ERROR; - break; - } - return rc; -} - -static void errreg_cbfunc (pmix_status_t status, - size_t errhandler_ref, - void *cbdata) -{ - ext2x_opcaddy_t *op = (ext2x_opcaddy_t*)cbdata; - - OPAL_ACQUIRE_OBJECT(op); - op->event->index = errhandler_ref; - opal_output_verbose(5, opal_pmix_base_framework.framework_output, - "PMIX2x errreg_cbfunc - error handler registered status=%d, reference=%lu", - status, (unsigned long)errhandler_ref); - if (NULL != op->evregcbfunc) { - op->evregcbfunc(ext2x_convert_rc(status), errhandler_ref, op->cbdata); - } - OBJ_RELEASE(op); -} - -static void register_handler(opal_list_t *event_codes, - opal_list_t *info, - opal_pmix_notification_fn_t evhandler, - opal_pmix_evhandler_reg_cbfunc_t cbfunc, - void *cbdata) -{ - ext2x_opcaddy_t *op = (ext2x_opcaddy_t*)cbdata; - size_t n; - opal_value_t *kv; - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - if (0 >= opal_pmix_base.initialized) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - if (NULL != cbfunc) { - cbfunc(OPAL_ERR_NOT_INITIALIZED, 0, cbdata); - } - return; - } - - op = OBJ_NEW(ext2x_opcaddy_t); - op->evregcbfunc = cbfunc; - op->cbdata = cbdata; - - /* convert the event codes */ - if (NULL != event_codes) { - op->ncodes = opal_list_get_size(event_codes); - op->pcodes = (pmix_status_t*)malloc(op->ncodes * sizeof(pmix_status_t)); - n=0; - OPAL_LIST_FOREACH(kv, event_codes, opal_value_t) { - op->pcodes[n] = ext2x_convert_opalrc(kv->data.integer); - ++n; - } - } - - /* convert the list of info to an array of pmix_info_t */ - if (NULL != info) { - op->ninfo = opal_list_get_size(info); - if (0 < op->ninfo) { - PMIX_INFO_CREATE(op->info, op->ninfo); - n=0; - OPAL_LIST_FOREACH(kv, info, opal_value_t) { - (void)strncpy(op->info[n].key, kv->key, PMIX_MAX_KEYLEN); - ext2x_value_load(&op->info[n].value, kv); - ++n; - } - } - } - - /* register the event */ - op->event = OBJ_NEW(opal_ext2x_event_t); - op->event->handler = evhandler; - opal_list_append(&mca_pmix_ext2x_component.events, &op->event->super); - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - PMIx_Register_event_handler(op->pcodes, op->ncodes, - op->info, op->ninfo, - ext2x_event_hdlr, errreg_cbfunc, op); - return; -} - -static void deregister_handler(size_t evhandler, - opal_pmix_op_cbfunc_t cbfunc, - void *cbdata) -{ - ext2x_opcaddy_t *op; - opal_ext2x_event_t *event; - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - if (0 >= opal_pmix_base.initialized) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - if (NULL != cbfunc) { - cbfunc(OPAL_ERR_NOT_INITIALIZED, cbdata); - } - return; - } - - /* look for this event */ - OPAL_LIST_FOREACH(event, &mca_pmix_ext2x_component.events, opal_ext2x_event_t) { - if (evhandler == event->index) { - opal_list_remove_item(&mca_pmix_ext2x_component.events, &event->super); - OBJ_RELEASE(event); - break; - } - } - - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - op = OBJ_NEW(ext2x_opcaddy_t); - op->opcbfunc = cbfunc; - op->cbdata = cbdata; - - /* tell the library to deregister this handler */ - PMIx_Deregister_event_handler(evhandler, opcbfunc, op); - return; -} - -static void notify_complete(pmix_status_t status, void *cbdata) -{ - ext2x_opcaddy_t *op = (ext2x_opcaddy_t*)cbdata; - if (NULL != op->opcbfunc) { - op->opcbfunc(ext2x_convert_rc(status), op->cbdata); - } - OBJ_RELEASE(op); -} - -static int notify_event(int status, - const opal_process_name_t *source, - opal_pmix_data_range_t range, - opal_list_t *info, - opal_pmix_op_cbfunc_t cbfunc, void *cbdata) -{ - ext2x_opcaddy_t *op; - opal_value_t *kv; - pmix_proc_t p, *pptr; - pmix_status_t pstatus; - size_t n; - pmix_data_range_t prange; - char *nsptr; - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - if (0 >= opal_pmix_base.initialized) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_INITIALIZED; - } - - op = OBJ_NEW(ext2x_opcaddy_t); - - /* convert the status */ - pstatus = ext2x_convert_opalrc(status); - - /* convert the source */ - if (NULL == source) { - pptr = NULL; - } else { - if (NULL == (nsptr = ext2x_convert_jobid(source->jobid))) { - OBJ_RELEASE(op); - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_FOUND; - } - (void)strncpy(p.nspace, nsptr, PMIX_MAX_NSLEN); - p.rank = ext2x_convert_opalrank(source->vpid); - pptr = &p; - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - /* convert the range */ - prange = ext2x_convert_opalrange(range); - - /* convert the list of info */ - if (NULL != info) { - op->ninfo = opal_list_get_size(info); - if (0 < op->ninfo) { - PMIX_INFO_CREATE(op->info, op->ninfo); - n=0; - OPAL_LIST_FOREACH(kv, info, opal_value_t) { - (void)strncpy(op->info[n].key, kv->key, PMIX_MAX_KEYLEN); - ext2x_value_load(&op->info[n].value, kv); - ++n; - } - } - } - - /* ask the library to notify our clients */ - pstatus = PMIx_Notify_event(pstatus, pptr, prange, op->info, op->ninfo, notify_complete, op); - - return ext2x_convert_rc(pstatus); -} - -static void relcbfunc(void *cbdata) -{ - opal_list_t *results = (opal_list_t*)cbdata; - if (NULL != results) { - OPAL_LIST_RELEASE(results); - } -} - -static void infocbfunc(pmix_status_t status, - pmix_info_t *info, size_t ninfo, - void *cbdata, - pmix_release_cbfunc_t release_fn, - void *release_cbdata) -{ - ext2x_opcaddy_t *cd = (ext2x_opcaddy_t*)cbdata; - int rc = OPAL_SUCCESS; - opal_list_t *results = NULL; - opal_value_t *iptr; - size_t n; - - OPAL_ACQUIRE_OBJECT(cd); - - /* convert the array of pmix_info_t to the list of info */ - if (NULL != info) { - results = OBJ_NEW(opal_list_t); - for (n=0; n < ninfo; n++) { - iptr = OBJ_NEW(opal_value_t); - opal_list_append(results, &iptr->super); - iptr->key = strdup(info[n].key); - if (OPAL_SUCCESS != (rc = ext2x_value_unload(iptr, &info[n].value))) { - OPAL_LIST_RELEASE(results); - results = NULL; - break; - } - } - } - - if (NULL != release_fn) { - release_fn(release_cbdata); - } - - /* return the values to the original requestor */ - if (NULL != cd->qcbfunc) { - cd->qcbfunc(rc, results, cd->cbdata, relcbfunc, results); - } - OBJ_RELEASE(cd); -} - -static void ext2x_query(opal_list_t *queries, - opal_pmix_info_cbfunc_t cbfunc, void *cbdata) -{ - int rc; - opal_value_t *ival; - size_t n, nqueries, nq; - ext2x_opcaddy_t *cd; - pmix_status_t prc; - opal_pmix_query_t *q; - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - if (0 >= opal_pmix_base.initialized) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - if (NULL != cbfunc) { - cbfunc(OPAL_ERR_NOT_INITIALIZED, NULL, cbdata, NULL, NULL); - } - return; - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - /* create the caddy */ - cd = OBJ_NEW(ext2x_opcaddy_t); - - /* bozo check */ - if (NULL == queries || 0 == (nqueries = opal_list_get_size(queries))) { - rc = OPAL_ERR_BAD_PARAM; - goto CLEANUP; - } - - /* setup the operation */ - cd->qcbfunc = cbfunc; - cd->cbdata = cbdata; - cd->nqueries = nqueries; - - /* convert the list to an array of query objects */ - PMIX_QUERY_CREATE(cd->queries, cd->nqueries); - n=0; - OPAL_LIST_FOREACH(q, queries, opal_pmix_query_t) { - cd->queries[n].keys = opal_argv_copy(q->keys); - cd->queries[n].nqual = opal_list_get_size(&q->qualifiers); - if (0 < cd->queries[n].nqual) { - PMIX_INFO_CREATE(cd->queries[n].qualifiers, cd->queries[n].nqual); - nq = 0; - OPAL_LIST_FOREACH(ival, &q->qualifiers, opal_value_t) { - (void)strncpy(cd->queries[n].qualifiers[nq].key, ival->key, PMIX_MAX_KEYLEN); - ext2x_value_load(&cd->queries[n].qualifiers[nq].value, ival); - ++nq; - } - } - ++n; - } - - /* pass it down */ - if (PMIX_SUCCESS != (prc = PMIx_Query_info_nb(cd->queries, cd->nqueries, - infocbfunc, cd))) { - /* do not hang! */ - rc = ext2x_convert_rc(prc); - goto CLEANUP; - } - - return; - - CLEANUP: - if (NULL != cbfunc) { - cbfunc(rc, NULL, cbdata, NULL, NULL); - } - OBJ_RELEASE(cd); - return; -} - -static void ext2x_log(opal_list_t *info, - opal_pmix_op_cbfunc_t cbfunc, void *cbdata) -{ - int rc; - opal_value_t *ival; - size_t n, ninfo; - ext2x_opcaddy_t *cd; - pmix_status_t prc; - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - if (0 >= opal_pmix_base.initialized) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - if (NULL != cbfunc) { - cbfunc(OPAL_ERR_NOT_INITIALIZED, cbdata); - } - return; - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - /* create the caddy */ - cd = OBJ_NEW(ext2x_opcaddy_t); - - /* bozo check */ - if (NULL == info || 0 == (ninfo = opal_list_get_size(info))) { - rc = OPAL_ERR_BAD_PARAM; - goto CLEANUP; - } - - /* setup the operation */ - cd->opcbfunc = cbfunc; - cd->cbdata = cbdata; - cd->ninfo = ninfo; - - /* convert the list to an array of info objects */ - PMIX_INFO_CREATE(cd->info, cd->ninfo); - n=0; - OPAL_LIST_FOREACH(ival, info, opal_value_t) { - (void)strncpy(cd->info[n].key, ival->key, PMIX_MAX_KEYLEN); - ext2x_value_load(&cd->info[n].value, ival); - ++n; - } - - /* pass it down */ - if (PMIX_SUCCESS != (prc = PMIx_Log_nb(cd->info, cd->ninfo, NULL, 0, - opcbfunc, cd))) { - /* do not hang! */ - rc = ext2x_convert_rc(prc); - goto CLEANUP; - } - - return; - - CLEANUP: - if (NULL != cbfunc) { - cbfunc(rc, cbdata); - } - OBJ_RELEASE(cd); -} - -opal_pmix_alloc_directive_t ext2x_convert_allocdir(pmix_alloc_directive_t dir) -{ - switch (dir) { - case PMIX_ALLOC_NEW: - return OPAL_PMIX_ALLOC_NEW; - case PMIX_ALLOC_EXTEND: - return OPAL_PMIX_ALLOC_EXTEND; - case PMIX_ALLOC_RELEASE: - return OPAL_PMIX_ALLOC_RELEASE; - case PMIX_ALLOC_REAQUIRE: - return OPAL_PMIX_ALLOC_REAQCUIRE; - default: - return OPAL_PMIX_ALLOC_UNDEF; - } -} - -/**** INSTANTIATE INTERNAL CLASSES ****/ -OBJ_CLASS_INSTANCE(opal_ext2x_jobid_trkr_t, - opal_list_item_t, - NULL, NULL); - -static void evcon(opal_ext2x_event_t *p) -{ - OPAL_PMIX_CONSTRUCT_LOCK(&p->lock); - p->handler = NULL; - p->cbdata = NULL; -} -static void evdes(opal_ext2x_event_t *p) -{ - OPAL_PMIX_DESTRUCT_LOCK(&p->lock); -} -OBJ_CLASS_INSTANCE(opal_ext2x_event_t, - opal_list_item_t, - evcon, evdes); - -static void opcon(ext2x_opcaddy_t *p) -{ - memset(&p->p, 0, sizeof(pmix_proc_t)); - p->nspace = NULL; - p->procs = NULL; - p->nprocs = 0; - p->pdata = NULL; - p->npdata = 0; - p->error_procs = NULL; - p->nerror_procs = 0; - p->info = NULL; - p->ninfo = 0; - p->apps = NULL; - p->sz = 0; - OPAL_PMIX_CONSTRUCT_LOCK(&p->lock); - p->codes = NULL; - p->pcodes = NULL; - p->ncodes = 0; - p->queries = NULL; - p->nqueries = 0; - p->event = NULL; - p->opcbfunc = NULL; - p->mdxcbfunc = NULL; - p->valcbfunc = NULL; - p->lkcbfunc = NULL; - p->spcbfunc = NULL; - p->evregcbfunc = NULL; - p->qcbfunc = NULL; - p->cbdata = NULL; -} -static void opdes(ext2x_opcaddy_t *p) -{ - OPAL_PMIX_DESTRUCT_LOCK(&p->lock); - if (NULL != p->nspace) { - free(p->nspace); - } - if (NULL != p->procs) { - PMIX_PROC_FREE(p->procs, p->nprocs); - } - if (NULL != p->pdata) { - PMIX_PDATA_FREE(p->pdata, p->npdata); - } - if (NULL != p->error_procs) { - PMIX_PROC_FREE(p->error_procs, p->nerror_procs); - } - if (NULL != p->info) { - PMIX_INFO_FREE(p->info, p->ninfo); - } - if (NULL != p->apps) { - PMIX_APP_FREE(p->apps, p->sz); - } - if (NULL != p->pcodes) { - free(p->pcodes); - } - if (NULL != p->queries) { - PMIX_QUERY_FREE(p->queries, p->nqueries); - } -} -OBJ_CLASS_INSTANCE(ext2x_opcaddy_t, - opal_object_t, - opcon, opdes); - -static void ocadcon(ext2x_opalcaddy_t *p) -{ - OBJ_CONSTRUCT(&p->procs, opal_list_t); - OBJ_CONSTRUCT(&p->info, opal_list_t); - OBJ_CONSTRUCT(&p->apps, opal_list_t); - p->opcbfunc = NULL; - p->dmdxfunc = NULL; - p->mdxcbfunc = NULL; - p->lkupcbfunc = NULL; - p->spwncbfunc = NULL; - p->cbdata = NULL; - p->odmdxfunc = NULL; - p->infocbfunc = NULL; - p->toolcbfunc = NULL; - p->ocbdata = NULL; -} -static void ocaddes(ext2x_opalcaddy_t *p) -{ - OPAL_LIST_DESTRUCT(&p->procs); - OPAL_LIST_DESTRUCT(&p->info); - OPAL_LIST_DESTRUCT(&p->apps); -} -OBJ_CLASS_INSTANCE(ext2x_opalcaddy_t, - opal_object_t, - ocadcon, ocaddes); - -static void tscon(ext2x_threadshift_t *p) -{ - OPAL_PMIX_CONSTRUCT_LOCK(&p->lock); - p->msg = NULL; - p->strings = NULL; - p->source = NULL; - p->event_codes = NULL; - p->info = NULL; - OBJ_CONSTRUCT(&p->results, opal_list_t); - p->evhandler = NULL; - p->nondefault = false; - p->cbfunc = NULL; - p->opcbfunc = NULL; - p->cbdata = NULL; -} -static void tsdes(ext2x_threadshift_t *p) -{ - OPAL_PMIX_DESTRUCT_LOCK(&p->lock); - if (NULL != p->strings) { - free(p->strings); - } - OPAL_LIST_DESTRUCT(&p->results); -} -OBJ_CLASS_INSTANCE(ext2x_threadshift_t, - opal_object_t, - tscon, tsdes); - -static void dmcon(opal_ext2x_dmx_trkr_t *p) -{ - p->nspace = NULL; - p->cbfunc = NULL; - p->cbdata = NULL; -} -static void dmdes(opal_ext2x_dmx_trkr_t *p) -{ - if (NULL != p->nspace) { - free(p->nspace); - } -} -OBJ_CLASS_INSTANCE(opal_ext2x_dmx_trkr_t, - opal_list_item_t, - dmcon, dmdes); diff --git a/opal/mca/pmix/ext2x/pmix2x.h b/opal/mca/pmix/ext2x/pmix2x.h deleted file mode 100644 index 5e2661d9ba..0000000000 --- a/opal/mca/pmix/ext2x/pmix2x.h +++ /dev/null @@ -1,332 +0,0 @@ -/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */ -/* - * Copyright (c) 2014-2017 Intel, Inc. All rights reserved. - * Copyright (c) 2014-2015 Mellanox Technologies, Inc. - * All rights reserved. - * Copyright (c) 2016 Research Organization for Information Science - * and Technology (RIST). All rights reserved. - * Copyright (c) 2017 Los Alamos National Security, LLC. All rights - * reserved. - * $COPYRIGHT$ - * - * Additional copyrights may follow - * - * $HEADER$ - */ - -#ifndef MCA_PMIX_EXT2X_H -#define MCA_PMIX_EXT2X_H - -#include "opal_config.h" - -#ifdef HAVE_SYS_SOCKET_H -#include -#endif -#ifdef HAVE_SYS_UN_H -#include -#endif - -#include "opal/class/opal_list.h" -#include "opal/mca/mca.h" -#include "opal/mca/event/event.h" -#include "opal/util/proc.h" - -#include "opal/mca/pmix/base/base.h" -#include "pmix_server.h" -#include "pmix_common.h" - -BEGIN_C_DECLS - -#ifdef OPAL_C_HAVE_VISIBILITY -#define PMIX_HAVE_VISIBILITY 1 -#else -#undef PMIX_HAVE_VISIBILITY -#endif - -typedef struct { - opal_pmix_base_component_t super; - opal_list_t jobids; - bool native_launch; - size_t evindex; - opal_list_t events; - int cache_size; - opal_list_t cache; - opal_list_t dmdx; - bool silence_warning; -} mca_pmix_ext2x_component_t; - -OPAL_DECLSPEC extern mca_pmix_ext2x_component_t mca_pmix_ext2x_component; - -OPAL_DECLSPEC extern const opal_pmix_base_module_t opal_pmix_ext2x_module; - -/**** INTERNAL OBJECTS ****/ -typedef struct { - opal_list_item_t super; - opal_jobid_t jobid; - char nspace[PMIX_MAX_NSLEN + 1]; -} opal_ext2x_jobid_trkr_t; -OBJ_CLASS_DECLARATION(opal_ext2x_jobid_trkr_t); - -typedef struct { - opal_list_item_t super; - opal_pmix_lock_t lock; - size_t index; - opal_pmix_notification_fn_t handler; - void *cbdata; -} opal_ext2x_event_t; -OBJ_CLASS_DECLARATION(opal_ext2x_event_t); - -typedef struct { - opal_list_item_t super; - char *nspace; - pmix_modex_cbfunc_t cbfunc; - void *cbdata; -} opal_ext2x_dmx_trkr_t; -OBJ_CLASS_DECLARATION(opal_ext2x_dmx_trkr_t); - -typedef struct { - opal_object_t super; - opal_event_t ev; - pmix_status_t status; - char *nspace; - pmix_proc_t p; - pmix_proc_t *procs; - size_t nprocs; - pmix_pdata_t *pdata; - size_t npdata; - pmix_proc_t *error_procs; - size_t nerror_procs; - pmix_info_t *info; - size_t ninfo; - pmix_app_t *apps; - size_t sz; - opal_pmix_lock_t lock; - opal_list_t *codes; - pmix_status_t *pcodes; - size_t ncodes; - pmix_query_t *queries; - size_t nqueries; - opal_ext2x_event_t *event; - opal_pmix_op_cbfunc_t opcbfunc; - opal_pmix_modex_cbfunc_t mdxcbfunc; - opal_pmix_value_cbfunc_t valcbfunc; - opal_pmix_lookup_cbfunc_t lkcbfunc; - opal_pmix_spawn_cbfunc_t spcbfunc; - opal_pmix_evhandler_reg_cbfunc_t evregcbfunc; - opal_pmix_info_cbfunc_t qcbfunc; - void *cbdata; -} ext2x_opcaddy_t; -OBJ_CLASS_DECLARATION(ext2x_opcaddy_t); - -typedef struct { - opal_object_t super; - opal_list_t procs; - opal_list_t info; - opal_list_t apps; - pmix_op_cbfunc_t opcbfunc; - pmix_dmodex_response_fn_t dmdxfunc; - pmix_modex_cbfunc_t mdxcbfunc; - pmix_lookup_cbfunc_t lkupcbfunc; - pmix_spawn_cbfunc_t spwncbfunc; - pmix_info_cbfunc_t infocbfunc; - pmix_tool_connection_cbfunc_t toolcbfunc; - void *cbdata; - opal_pmix_release_cbfunc_t odmdxfunc; - void *ocbdata; -} ext2x_opalcaddy_t; -OBJ_CLASS_DECLARATION(ext2x_opalcaddy_t); - -typedef struct { - opal_object_t super; - opal_event_t ev; - opal_pmix_lock_t lock; - const char *msg; - char *strings; - size_t id; - int status; - opal_process_name_t pname; - opal_jobid_t jobid; - const opal_process_name_t *source; - opal_pmix_data_range_t range; - bool nondefault; - size_t handler; - opal_value_t *val; - opal_list_t *event_codes; - opal_list_t *info; - opal_list_t results; - opal_pmix_notification_fn_t evhandler; - opal_pmix_evhandler_reg_cbfunc_t cbfunc; - opal_pmix_op_cbfunc_t opcbfunc; - pmix_event_notification_cbfunc_fn_t pmixcbfunc; - opal_pmix_value_cbfunc_t valcbfunc; - opal_pmix_lookup_cbfunc_t lkcbfunc; - void *cbdata; -} ext2x_threadshift_t; -OBJ_CLASS_DECLARATION(ext2x_threadshift_t); - -#define OPAL_PMIX_OP_THREADSHIFT(e, fn, cb, cd) \ - do { \ - ext2x_threadshift_t *_cd; \ - _cd = OBJ_NEW(ext2x_threadshift_t); \ - _cd->handler = (e); \ - _cd->opcbfunc = (cb); \ - _cd->cbdata = (cd); \ - opal_event_assign(&((_cd)->ev), opal_pmix_base.evbase, \ - -1, EV_WRITE, (fn), (_cd)); \ - OPAL_POST_OBJECT(_cd); \ - opal_event_active(&((_cd)->ev), EV_WRITE, 1); \ - } while(0) - -#define OPAL_PMIX_THREADSHIFT(e, i, eh, fn, cb, cd) \ - do { \ - ext2x_threadshift_t *_cd; \ - _cd = OBJ_NEW(ext2x_threadshift_t); \ - _cd->event_codes = (e); \ - _cd->info = (i); \ - _cd->evhandler = (eh); \ - _cd->cbfunc = (cb); \ - _cd->cbdata = (cd); \ - opal_event_assign(&((_cd)->ev), opal_pmix_base.evbase, \ - -1, EV_WRITE, (fn), (_cd)); \ - OPAL_POST_OBJECT(_cd); \ - opal_event_active(&((_cd)->ev), EV_WRITE, 1); \ - } while(0) - -#define OPAL_PMIX_NOTIFY_THREADSHIFT(s, sr, r, i, fn, cb, cd) \ - do { \ - ext2x_threadshift_t *_cd; \ - _cd = OBJ_NEW(ext2x_threadshift_t); \ - _cd->status = (s); \ - _cd->source = (sr); \ - _cd->range = (r); \ - _cd->info = (i); \ - _cd->opcbfunc = (cb); \ - _cd->cbdata = (cd); \ - opal_event_assign(&((_cd)->ev), opal_pmix_base.evbase, \ - -1, EV_WRITE, (fn), (_cd)); \ - OPAL_POST_OBJECT(_cd); \ - opal_event_active(&((_cd)->ev), EV_WRITE, 1); \ - } while(0) - -#define OPAL_PMIX2X_THREADSHIFT(p, cb) \ - do { \ - opal_event_assign(&((p)->ev), opal_pmix_base.evbase, \ - -1, EV_WRITE, (cb), (p)); \ - OPAL_POST_OBJECT(p); \ - opal_event_active(&((p)->ev), EV_WRITE, 1); \ - } while(0) - -/**** CLIENT FUNCTIONS ****/ -OPAL_MODULE_DECLSPEC int ext2x_client_init(opal_list_t *ilist); -OPAL_MODULE_DECLSPEC int ext2x_client_finalize(void); -OPAL_MODULE_DECLSPEC int ext2x_initialized(void); -OPAL_MODULE_DECLSPEC int ext2x_abort(int flag, const char *msg, - opal_list_t *procs); -OPAL_MODULE_DECLSPEC int ext2x_commit(void); -OPAL_MODULE_DECLSPEC int ext2x_fence(opal_list_t *procs, int collect_data); -OPAL_MODULE_DECLSPEC int ext2x_fencenb(opal_list_t *procs, int collect_data, - opal_pmix_op_cbfunc_t cbfunc, void *cbdata); -OPAL_MODULE_DECLSPEC int ext2x_put(opal_pmix_scope_t scope, - opal_value_t *val); -OPAL_MODULE_DECLSPEC int ext2x_get(const opal_process_name_t *proc, const char *key, - opal_list_t *info, opal_value_t **val); -OPAL_MODULE_DECLSPEC int ext2x_getnb(const opal_process_name_t *proc, const char *key, - opal_list_t *info, - opal_pmix_value_cbfunc_t cbfunc, void *cbdata); -OPAL_MODULE_DECLSPEC int ext2x_publish(opal_list_t *info); -OPAL_MODULE_DECLSPEC int ext2x_publishnb(opal_list_t *info, - opal_pmix_op_cbfunc_t cbfunc, void *cbdata); -OPAL_MODULE_DECLSPEC int ext2x_lookup(opal_list_t *data, opal_list_t *info); -OPAL_MODULE_DECLSPEC int ext2x_lookupnb(char **keys, opal_list_t *info, - opal_pmix_lookup_cbfunc_t cbfunc, void *cbdata); -OPAL_MODULE_DECLSPEC int ext2x_unpublish(char **keys, opal_list_t *info); -OPAL_MODULE_DECLSPEC int ext2x_unpublishnb(char **keys, opal_list_t *info, - opal_pmix_op_cbfunc_t cbfunc, void *cbdata); -OPAL_MODULE_DECLSPEC int ext2x_spawn(opal_list_t *job_info, opal_list_t *apps, opal_jobid_t *jobid); -OPAL_MODULE_DECLSPEC int ext2x_spawnnb(opal_list_t *job_info, opal_list_t *apps, - opal_pmix_spawn_cbfunc_t cbfunc, void *cbdata); -OPAL_MODULE_DECLSPEC int ext2x_connect(opal_list_t *procs); -OPAL_MODULE_DECLSPEC int ext2x_connectnb(opal_list_t *procs, - opal_pmix_op_cbfunc_t cbfunc, - void *cbdata); -OPAL_MODULE_DECLSPEC int ext2x_disconnect(opal_list_t *procs); -OPAL_MODULE_DECLSPEC int ext2x_disconnectnb(opal_list_t *procs, - opal_pmix_op_cbfunc_t cbfunc, - void *cbdata); -OPAL_MODULE_DECLSPEC int ext2x_resolve_peers(const char *nodename, opal_jobid_t jobid, - opal_list_t *procs); -OPAL_MODULE_DECLSPEC int ext2x_resolve_nodes(opal_jobid_t jobid, char **nodelist); - -/**** TOOL FUNCTIONS ****/ -OPAL_MODULE_DECLSPEC int ext2x_tool_init(opal_list_t *info); -OPAL_MODULE_DECLSPEC int ext2x_tool_fini(void); - -/**** COMMON FUNCTIONS ****/ -OPAL_MODULE_DECLSPEC int ext2x_store_local(const opal_process_name_t *proc, - opal_value_t *val); - -/**** SERVER SOUTHBOUND FUNCTIONS ****/ -OPAL_MODULE_DECLSPEC int ext2x_server_init(opal_pmix_server_module_t *module, - opal_list_t *info); -OPAL_MODULE_DECLSPEC int ext2x_server_finalize(void); -OPAL_MODULE_DECLSPEC int ext2x_server_gen_regex(const char *input, char **regex); -OPAL_MODULE_DECLSPEC int ext2x_server_gen_ppn(const char *input, char **ppn); -OPAL_MODULE_DECLSPEC int ext2x_server_register_nspace(opal_jobid_t jobid, - int nlocalprocs, - opal_list_t *info, - opal_pmix_op_cbfunc_t cbfunc, - void *cbdata); -OPAL_MODULE_DECLSPEC void ext2x_server_deregister_nspace(opal_jobid_t jobid, - opal_pmix_op_cbfunc_t cbfunc, - void *cbdata); -OPAL_MODULE_DECLSPEC int ext2x_server_register_client(const opal_process_name_t *proc, - uid_t uid, gid_t gid, - void *server_object, - opal_pmix_op_cbfunc_t cbfunc, - void *cbdata); -OPAL_MODULE_DECLSPEC void ext2x_server_deregister_client(const opal_process_name_t *proc, - opal_pmix_op_cbfunc_t cbfunc, - void *cbdata); -OPAL_MODULE_DECLSPEC int ext2x_server_setup_fork(const opal_process_name_t *proc, char ***env); -OPAL_MODULE_DECLSPEC int ext2x_server_dmodex(const opal_process_name_t *proc, - opal_pmix_modex_cbfunc_t cbfunc, void *cbdata); -OPAL_MODULE_DECLSPEC int ext2x_server_notify_event(int status, - const opal_process_name_t *source, - opal_list_t *info, - opal_pmix_op_cbfunc_t cbfunc, void *cbdata); - - -/**** COMPONENT UTILITY FUNCTIONS ****/ -OPAL_MODULE_DECLSPEC void ext2x_event_hdlr(size_t evhdlr_registration_id, - pmix_status_t status, const pmix_proc_t *source, - pmix_info_t info[], size_t ninfo, - pmix_info_t results[], size_t nresults, - pmix_event_notification_cbfunc_fn_t cbfunc, - void *cbdata); -OPAL_MODULE_DECLSPEC pmix_status_t ext2x_convert_opalrc(int rc); -OPAL_MODULE_DECLSPEC int ext2x_convert_rc(pmix_status_t rc); - -OPAL_MODULE_DECLSPEC opal_vpid_t ext2x_convert_rank(pmix_rank_t rank); -OPAL_MODULE_DECLSPEC pmix_rank_t ext2x_convert_opalrank(opal_vpid_t vpid); - -OPAL_MODULE_DECLSPEC opal_pmix_scope_t ext2x_convert_scope(pmix_scope_t scope); -OPAL_MODULE_DECLSPEC pmix_scope_t ext2x_convert_opalscope(opal_pmix_scope_t scope); - -OPAL_MODULE_DECLSPEC pmix_data_range_t ext2x_convert_opalrange(opal_pmix_data_range_t range); -OPAL_MODULE_DECLSPEC opal_pmix_data_range_t ext2x_convert_range(pmix_data_range_t range); - -OPAL_MODULE_DECLSPEC opal_pmix_persistence_t ext2x_convert_persist(pmix_persistence_t scope); -OPAL_MODULE_DECLSPEC pmix_persistence_t ext2x_convert_opalpersist(opal_pmix_persistence_t scope); - -OPAL_MODULE_DECLSPEC void ext2x_value_load(pmix_value_t *v, - opal_value_t *kv); -OPAL_MODULE_DECLSPEC int ext2x_value_unload(opal_value_t *kv, - const pmix_value_t *v); - -OPAL_MODULE_DECLSPEC opal_pmix_alloc_directive_t ext2x_convert_allocdir(pmix_alloc_directive_t dir); - -OPAL_MODULE_DECLSPEC char* ext2x_convert_jobid(opal_jobid_t jobid); - -END_C_DECLS - -#endif /* MCA_PMIX_EXTERNAL_H */ diff --git a/opal/mca/pmix/ext2x/pmix2x_client.c b/opal/mca/pmix/ext2x/pmix2x_client.c deleted file mode 100644 index d2b273156c..0000000000 --- a/opal/mca/pmix/ext2x/pmix2x_client.c +++ /dev/null @@ -1,1547 +0,0 @@ -/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */ -/* - * Copyright (c) 2014-2017 Intel, Inc. All rights reserved. - * Copyright (c) 2014-2017 Research Organization for Information Science - * and Technology (RIST). All rights reserved. - * Copyright (c) 2014-2017 Mellanox Technologies, Inc. - * All rights reserved. - * Copyright (c) 2016 Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2016 Los Alamos National Security, LLC. All rights - * reserved. - * $COPYRIGHT$ - * - * Additional copyrights may follow - * - * $HEADER$ - */ - -#include "opal_config.h" -#include "opal/constants.h" -#include "opal/types.h" - -#ifdef HAVE_STRING_H -#include -#endif -#ifdef HAVE_UNISTD_H -#include -#endif - -#include "opal/hash_string.h" -#include "opal/threads/threads.h" -#include "opal/util/argv.h" -#include "opal/util/opal_environ.h" -#include "opal/util/proc.h" -#include "opal/util/show_help.h" - -#include "opal/mca/pmix/base/base.h" -#include "pmix2x.h" -#include "pmix.h" -#include "pmix_tool.h" - -static pmix_proc_t my_proc; -static char *dbgvalue=NULL; - -static void errreg_cbfunc (pmix_status_t status, - size_t errhandler_ref, - void *cbdata) -{ - opal_ext2x_event_t *event = (opal_ext2x_event_t*)cbdata; - - OPAL_ACQUIRE_OBJECT(event); - - event->index = errhandler_ref; - opal_output_verbose(5, opal_pmix_base_framework.framework_output, - "PMIX client errreg_cbfunc - error handler registered status=%d, reference=%lu", - status, (unsigned long)errhandler_ref); - OPAL_POST_OBJECT(event); - OPAL_PMIX_WAKEUP_THREAD(&event->lock); -} - -int ext2x_client_init(opal_list_t *ilist) -{ - opal_process_name_t pname; - pmix_status_t rc; - int dbg; - opal_ext2x_jobid_trkr_t *job; - opal_ext2x_event_t *event; - pmix_info_t *pinfo; - size_t ninfo, n; - opal_value_t *ival; - - opal_output_verbose(1, opal_pmix_base_framework.framework_output, - "PMIx_client init"); - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - - if (0 == opal_pmix_base.initialized) { - if (0 < (dbg = opal_output_get_verbosity(opal_pmix_base_framework.framework_output))) { - asprintf(&dbgvalue, "PMIX_DEBUG=%d", dbg); - putenv(dbgvalue); - } - } - - /* convert the incoming list to info structs */ - if (NULL != ilist && 0 < (ninfo = opal_list_get_size(ilist))) { - PMIX_INFO_CREATE(pinfo, ninfo); - n=0; - OPAL_LIST_FOREACH(ival, ilist, opal_value_t) { - (void)strncpy(pinfo[n].key, ival->key, PMIX_MAX_KEYLEN); - ext2x_value_load(&pinfo[n].value, ival); - ++n; - } - } else { - pinfo = NULL; - ninfo = 0; - } - - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - rc = PMIx_Init(&my_proc, pinfo, ninfo); - if (NULL != pinfo) { - PMIX_INFO_FREE(pinfo, ninfo); - } - if (PMIX_SUCCESS != rc) { - dbg = ext2x_convert_rc(rc); - OPAL_ERROR_LOG(dbg); - return dbg; - } - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - - ++opal_pmix_base.initialized; - if (1 < opal_pmix_base.initialized) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_SUCCESS; - } - - /* store our jobid and rank */ - if (NULL != getenv(OPAL_MCA_PREFIX"orte_launch")) { - /* if we were launched by the OMPI RTE, then - * the jobid is in a special format - so get it */ - mca_pmix_ext2x_component.native_launch = true; - opal_convert_string_to_jobid(&pname.jobid, my_proc.nspace); - } else { - /* we were launched by someone else, so make the - * jobid just be the hash of the nspace */ - OPAL_HASH_JOBID(my_proc.nspace, pname.jobid); - } - /* insert this into our list of jobids - it will be the - * first, and so we'll check it first */ - job = OBJ_NEW(opal_ext2x_jobid_trkr_t); - (void)strncpy(job->nspace, my_proc.nspace, PMIX_MAX_NSLEN); - job->jobid = pname.jobid; - opal_list_append(&mca_pmix_ext2x_component.jobids, &job->super); - - pname.vpid = ext2x_convert_rank(my_proc.rank); - opal_proc_set_name(&pname); - - /* release the thread in case the event handler fires when - * registered */ - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - /* register the default event handler */ - event = OBJ_NEW(opal_ext2x_event_t); - opal_list_append(&mca_pmix_ext2x_component.events, &event->super); - PMIX_INFO_CREATE(pinfo, 1); - PMIX_INFO_LOAD(&pinfo[0], PMIX_EVENT_HDLR_NAME, "OPAL-PMIX-2X-DEFAULT", PMIX_STRING); - PMIx_Register_event_handler(NULL, 0, NULL, 0, ext2x_event_hdlr, errreg_cbfunc, event); - OPAL_PMIX_WAIT_THREAD(&event->lock); - PMIX_INFO_FREE(pinfo, 1); - - return OPAL_SUCCESS; - -} - -static void dereg_cbfunc(pmix_status_t st, void *cbdata) -{ - opal_ext2x_event_t *ev = (opal_ext2x_event_t*)cbdata; - OPAL_PMIX_WAKEUP_THREAD(&ev->lock); -} - -int ext2x_client_finalize(void) -{ - pmix_status_t rc; - opal_ext2x_event_t *event, *ev2; - - opal_output_verbose(1, opal_pmix_base_framework.framework_output, - "PMIx_client finalize"); - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - --opal_pmix_base.initialized; - - if (0 == opal_pmix_base.initialized) { - /* deregister all event handlers */ - OPAL_LIST_FOREACH_SAFE(event, ev2, &mca_pmix_ext2x_component.events, opal_ext2x_event_t) { - OPAL_PMIX_DESTRUCT_LOCK(&event->lock); - OPAL_PMIX_CONSTRUCT_LOCK(&event->lock); - PMIx_Deregister_event_handler(event->index, dereg_cbfunc, (void*)event); - OPAL_PMIX_WAIT_THREAD(&event->lock); - opal_list_remove_item(&mca_pmix_ext2x_component.events, &event->super); - OBJ_RELEASE(event); - } - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - rc = PMIx_Finalize(NULL, 0); - - return ext2x_convert_rc(rc); -} - -int ext2x_tool_init(opal_list_t *info) -{ - pmix_info_t *pinfo; - size_t ninfo, n; - opal_ext2x_jobid_trkr_t *job; - opal_value_t *val; - pmix_status_t rc; - int ret; - opal_process_name_t pname; - opal_ext2x_event_t *event; - - opal_output_verbose(1, opal_pmix_base_framework.framework_output, - "PMIx_tool init"); - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - - /* convert the incoming list to info structs */ - if (NULL != info && 0 < (ninfo = opal_list_get_size(info))) { - PMIX_INFO_CREATE(pinfo, ninfo); - n=0; - OPAL_LIST_FOREACH(val, info, opal_value_t) { - (void)strncpy(pinfo[n].key, val->key, PMIX_MAX_KEYLEN); - ext2x_value_load(&pinfo[n].value, val); - ++n; - } - } else { - pinfo = NULL; - ninfo = 0; - } - - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - rc = PMIx_tool_init(&my_proc, pinfo, ninfo); - if (NULL != pinfo) { - PMIX_INFO_FREE(pinfo, ninfo); - } - if (PMIX_SUCCESS != rc) { - ret = ext2x_convert_rc(rc); - OPAL_ERROR_LOG(ret); - return ret; - } - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - - ++opal_pmix_base.initialized; - if (1 < opal_pmix_base.initialized) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_SUCCESS; - } - - /* store our jobid and rank */ - if (NULL != getenv(OPAL_MCA_PREFIX"orte_launch")) { - /* if we were launched by the OMPI RTE, then - * the jobid is in a special format - so get it */ - mca_pmix_ext2x_component.native_launch = true; - opal_convert_string_to_jobid(&pname.jobid, my_proc.nspace); - } else { - /* we were launched by someone else, so make the - * jobid just be the hash of the nspace */ - OPAL_HASH_JOBID(my_proc.nspace, pname.jobid); - } - /* insert this into our list of jobids - it will be the - * first, and so we'll check it first */ - job = OBJ_NEW(opal_ext2x_jobid_trkr_t); - (void)strncpy(job->nspace, my_proc.nspace, PMIX_MAX_NSLEN); - job->jobid = pname.jobid; - opal_list_append(&mca_pmix_ext2x_component.jobids, &job->super); - - pname.vpid = ext2x_convert_rank(my_proc.rank); - opal_proc_set_name(&pname); - - /* release the thread in case the event handler fires when - * registered */ - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - /* register the default event handler */ - event = OBJ_NEW(opal_ext2x_event_t); - opal_list_append(&mca_pmix_ext2x_component.events, &event->super); - PMIX_INFO_CREATE(pinfo, 1); - PMIX_INFO_LOAD(&pinfo[0], PMIX_EVENT_HDLR_NAME, "OPAL-PMIX-2X-DEFAULT", PMIX_STRING); - PMIx_Register_event_handler(NULL, 0, NULL, 0, ext2x_event_hdlr, errreg_cbfunc, event); - OPAL_PMIX_WAIT_THREAD(&event->lock); - PMIX_INFO_FREE(pinfo, 1); - - return OPAL_SUCCESS; -} - -int ext2x_tool_fini(void) -{ - pmix_status_t rc; - opal_ext2x_event_t *event, *ev2; - - opal_output_verbose(1, opal_pmix_base_framework.framework_output, - "PMIx_tool finalize"); - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - --opal_pmix_base.initialized; - - if (0 == opal_pmix_base.initialized) { - /* deregister all event handlers */ - OPAL_LIST_FOREACH_SAFE(event, ev2, &mca_pmix_ext2x_component.events, opal_ext2x_event_t) { - OPAL_PMIX_DESTRUCT_LOCK(&event->lock); - OPAL_PMIX_CONSTRUCT_LOCK(&event->lock); - PMIx_Deregister_event_handler(event->index, dereg_cbfunc, (void*)event); - OPAL_PMIX_WAIT_THREAD(&event->lock); - opal_list_remove_item(&mca_pmix_ext2x_component.events, &event->super); - OBJ_RELEASE(event); - } - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - rc = PMIx_tool_finalize(); - - return ext2x_convert_rc(rc); -} - - -int ext2x_initialized(void) -{ - int init; - - opal_output_verbose(1, opal_pmix_base_framework.framework_output, - "PMIx_client initialized"); - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - init = opal_pmix_base.initialized; - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - return init; -} - -int ext2x_abort(int flag, const char *msg, - opal_list_t *procs) -{ - pmix_status_t rc; - pmix_proc_t *parray=NULL; - size_t n, cnt=0; - opal_namelist_t *ptr; - char *nsptr; - - opal_output_verbose(1, opal_pmix_base_framework.framework_output, - "PMIx_client abort"); - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - if (0 >= opal_pmix_base.initialized) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_INITIALIZED; - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - /* convert the list of procs to an array - * of pmix_proc_t */ - if (NULL != procs && 0 < (cnt = opal_list_get_size(procs))) { - PMIX_PROC_CREATE(parray, cnt); - n=0; - OPAL_LIST_FOREACH(ptr, procs, opal_namelist_t) { - if (NULL == (nsptr = ext2x_convert_jobid(ptr->name.jobid))) { - PMIX_PROC_FREE(parray, cnt); - return OPAL_ERR_NOT_FOUND; - } - (void)strncpy(parray[n].nspace, nsptr, PMIX_MAX_NSLEN); - parray[n].rank = ext2x_convert_opalrank(ptr->name.vpid); - ++n; - } - } - - /* call the library abort - this is a blocking call */ - rc = PMIx_Abort(flag, msg, parray, cnt); - - /* release the array */ - PMIX_PROC_FREE(parray, cnt); - - return ext2x_convert_rc(rc); -} - -int ext2x_store_local(const opal_process_name_t *proc, opal_value_t *val) -{ - pmix_value_t kv; - pmix_status_t rc; - pmix_proc_t p; - char *nsptr; - opal_ext2x_jobid_trkr_t *job; - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - - if (0 >= opal_pmix_base.initialized) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_INITIALIZED; - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - if (NULL != proc) { - if (NULL == (nsptr = ext2x_convert_jobid(proc->jobid))) { - job = OBJ_NEW(opal_ext2x_jobid_trkr_t); - (void)opal_snprintf_jobid(job->nspace, PMIX_MAX_NSLEN, proc->jobid); - job->jobid = proc->jobid; - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - opal_list_append(&mca_pmix_ext2x_component.jobids, &job->super); - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - nsptr = job->nspace; - } - (void)strncpy(p.nspace, nsptr, PMIX_MAX_NSLEN); - p.rank = ext2x_convert_opalrank(proc->vpid); - } else { - /* use our name */ - (void)strncpy(p.nspace, my_proc.nspace, PMIX_MAX_NSLEN); - p.rank = ext2x_convert_opalrank(OPAL_PROC_MY_NAME.vpid); - } - - PMIX_VALUE_CONSTRUCT(&kv); - ext2x_value_load(&kv, val); - - /* call the library - this is a blocking call */ - rc = PMIx_Store_internal(&p, val->key, &kv); - PMIX_VALUE_DESTRUCT(&kv); - - return ext2x_convert_rc(rc); -} - -int ext2x_commit(void) -{ - pmix_status_t rc; - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - if (0 >= opal_pmix_base.initialized) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_INITIALIZED; - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - rc = PMIx_Commit(); - return ext2x_convert_rc(rc); -} - -static void opcbfunc(pmix_status_t status, void *cbdata) -{ - ext2x_opcaddy_t *op = (ext2x_opcaddy_t*)cbdata; - - OPAL_ACQUIRE_OBJECT(op); - if (NULL != op->opcbfunc) { - op->opcbfunc(ext2x_convert_rc(status), op->cbdata); - } - OBJ_RELEASE(op); -} - -int ext2x_fence(opal_list_t *procs, int collect_data) -{ - pmix_status_t rc; - opal_namelist_t *ptr; - char *nsptr; - size_t cnt = 0, n; - pmix_proc_t *parray = NULL; - pmix_info_t info, *iptr; - - opal_output_verbose(1, opal_pmix_base_framework.framework_output, - "PMIx_client fence"); - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - if (0 >= opal_pmix_base.initialized) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_INITIALIZED; - } - - /* convert the list of procs to an array - * of pmix_proc_t */ - if (NULL != procs && 0 < (cnt = opal_list_get_size(procs))) { - PMIX_PROC_CREATE(parray, cnt); - n=0; - OPAL_LIST_FOREACH(ptr, procs, opal_namelist_t) { - if (NULL == (nsptr = ext2x_convert_jobid(ptr->name.jobid))) { - PMIX_PROC_FREE(parray, cnt); - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_FOUND; - } - (void)strncpy(parray[n].nspace, nsptr, PMIX_MAX_NSLEN); - parray[n].rank = ext2x_convert_opalrank(ptr->name.vpid); - ++n; - } - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - if (collect_data) { - PMIX_INFO_CONSTRUCT(&info); - (void)strncpy(info.key, PMIX_COLLECT_DATA, PMIX_MAX_KEYLEN); - info.value.type = PMIX_BOOL; - info.value.data.flag = true; - iptr = &info; - n = 1; - } else { - iptr = NULL; - n = 0; - } - - rc = PMIx_Fence(parray, cnt, iptr, n); - if (collect_data) { - PMIX_INFO_DESTRUCT(&info); - } - if (NULL != parray) { - PMIX_PROC_FREE(parray, cnt); - } - - return ext2x_convert_rc(rc); -} - -int ext2x_fencenb(opal_list_t *procs, int collect_data, - opal_pmix_op_cbfunc_t cbfunc, void *cbdata) -{ - pmix_status_t rc; - pmix_proc_t *parray=NULL; - size_t n, cnt=0; - opal_namelist_t *ptr; - ext2x_opcaddy_t *op; - char *nsptr; - - opal_output_verbose(1, opal_pmix_base_framework.framework_output, - "PMIx_client fencenb"); - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - if (0 >= opal_pmix_base.initialized) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_INITIALIZED; - } - - /* convert the list of procs to an array - * of pmix_proc_t */ - if (NULL != procs && 0 < (cnt = opal_list_get_size(procs))) { - PMIX_PROC_CREATE(parray, cnt); - n=0; - OPAL_LIST_FOREACH(ptr, procs, opal_namelist_t) { - if (NULL == (nsptr = ext2x_convert_jobid(ptr->name.jobid))) { - PMIX_PROC_FREE(parray, cnt); - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_FOUND; - } - (void)strncpy(parray[n].nspace, nsptr, PMIX_MAX_NSLEN); - parray[n].rank = ext2x_convert_opalrank(ptr->name.vpid); - ++n; - } - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - /* create the caddy */ - op = OBJ_NEW(ext2x_opcaddy_t); - op->opcbfunc = cbfunc; - op->cbdata = cbdata; - op->procs = parray; - op->nprocs = cnt; - - if (collect_data) { - op->ninfo = 1; - PMIX_INFO_CREATE(op->info, op->ninfo); - PMIX_INFO_LOAD(&op->info[0], PMIX_COLLECT_DATA, NULL, PMIX_BOOL); - } - - /* call the library function */ - rc = PMIx_Fence_nb(op->procs, op->nprocs, op->info, op->ninfo, opcbfunc, op); - return ext2x_convert_rc(rc); -} - -int ext2x_put(opal_pmix_scope_t opal_scope, - opal_value_t *val) -{ - pmix_value_t kv; - pmix_scope_t pmix_scope = ext2x_convert_opalscope(opal_scope); - pmix_status_t rc; - - opal_output_verbose(1, opal_pmix_base_framework.framework_output, - "PMIx_client put"); - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - if (0 >= opal_pmix_base.initialized) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_INITIALIZED; - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - PMIX_VALUE_CONSTRUCT(&kv); - ext2x_value_load(&kv, val); - - rc = PMIx_Put(pmix_scope, val->key, &kv); - PMIX_VALUE_DESTRUCT(&kv); - return ext2x_convert_rc(rc); -} - -int ext2x_get(const opal_process_name_t *proc, const char *key, - opal_list_t *info, opal_value_t **val) -{ - pmix_status_t rc; - pmix_proc_t p; - char *nsptr; - pmix_info_t *pinfo = NULL; - size_t sz = 0, n; - opal_value_t *ival; - pmix_value_t *pval = NULL; - int ret; - - opal_output_verbose(1, opal_pmix_base_framework.framework_output, - "%s ext2x:client get on proc %s key %s", - OPAL_NAME_PRINT(OPAL_PROC_MY_NAME), - (NULL == proc) ? "NULL" : OPAL_NAME_PRINT(*proc), key); - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - if (0 >= opal_pmix_base.initialized) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_INITIALIZED; - } - - if (NULL == proc) { - /* if they are asking for our jobid, then return it */ - if (0 == strcmp(key, OPAL_PMIX_JOBID)) { - (*val) = OBJ_NEW(opal_value_t); - (*val)->type = OPAL_UINT32; - (*val)->data.uint32 = OPAL_PROC_MY_NAME.jobid; - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_SUCCESS; - } - /* if they are asking for our rank, return it */ - if (0 == strcmp(key, OPAL_PMIX_RANK)) { - (*val) = OBJ_NEW(opal_value_t); - (*val)->type = OPAL_INT; - (*val)->data.integer = ext2x_convert_rank(my_proc.rank); - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_SUCCESS; - } - } - *val = NULL; - - if (NULL == proc) { - (void)strncpy(p.nspace, my_proc.nspace, PMIX_MAX_NSLEN); - p.rank = ext2x_convert_rank(PMIX_RANK_WILDCARD); - } else { - if (NULL == (nsptr = ext2x_convert_jobid(proc->jobid))) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_FOUND; - } - (void)strncpy(p.nspace, nsptr, PMIX_MAX_NSLEN); - p.rank = ext2x_convert_opalrank(proc->vpid); - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - if (NULL != info && 0 < (sz = opal_list_get_size(info))) { - PMIX_INFO_CREATE(pinfo, sz); - n=0; - OPAL_LIST_FOREACH(ival, info, opal_value_t) { - (void)strncpy(pinfo[n].key, ival->key, PMIX_MAX_KEYLEN); - ext2x_value_load(&pinfo[n].value, ival); - ++n; - } - } - - rc = PMIx_Get(&p, key, pinfo, sz, &pval); - if (PMIX_SUCCESS == rc) { - ival = OBJ_NEW(opal_value_t); - if (OPAL_SUCCESS != (ret = ext2x_value_unload(ival, pval))) { - rc = ext2x_convert_opalrc(ret); - } else { - *val = ival; - } - PMIX_VALUE_FREE(pval, 1); - } - PMIX_INFO_FREE(pinfo, sz); - - return ext2x_convert_rc(rc); -} - -static void val_cbfunc(pmix_status_t status, - pmix_value_t *kv, void *cbdata) -{ - ext2x_opcaddy_t *op = (ext2x_opcaddy_t*)cbdata; - int rc; - opal_value_t val, *v=NULL; - - OPAL_ACQUIRE_OBJECT(op); - OBJ_CONSTRUCT(&val, opal_value_t); - rc = ext2x_convert_opalrc(status); - if (PMIX_SUCCESS == status && NULL != kv) { - rc = ext2x_value_unload(&val, kv); - v = &val; - } - - if (NULL != op->valcbfunc) { - op->valcbfunc(rc, v, op->cbdata); - } - OBJ_DESTRUCT(&val); - OBJ_RELEASE(op); -} - -int ext2x_getnb(const opal_process_name_t *proc, const char *key, - opal_list_t *info, - opal_pmix_value_cbfunc_t cbfunc, void *cbdata) -{ - ext2x_opcaddy_t *op; - opal_value_t *val; - pmix_status_t rc; - char *nsptr; - size_t n; - - opal_output_verbose(1, opal_pmix_base_framework.framework_output, - "%s PMIx_client get_nb on proc %s key %s", - OPAL_NAME_PRINT(OPAL_PROC_MY_NAME), - (NULL == proc) ? "NULL" : OPAL_NAME_PRINT(*proc), key); - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - if (0 >= opal_pmix_base.initialized) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_INITIALIZED; - } - - if (NULL == proc) { - /* if they are asking for our jobid, then return it */ - if (0 == strcmp(key, OPAL_PMIX_JOBID)) { - if (NULL != cbfunc) { - val = OBJ_NEW(opal_value_t); - val->type = OPAL_UINT32; - val->data.uint32 = OPAL_PROC_MY_NAME.jobid; - cbfunc(OPAL_SUCCESS, val, cbdata); - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_SUCCESS; - } - /* if they are asking for our rank, return it */ - if (0 == strcmp(key, OPAL_PMIX_RANK)) { - if (NULL != cbfunc) { - val = OBJ_NEW(opal_value_t); - val->type = OPAL_INT; - val->data.integer = ext2x_convert_rank(my_proc.rank); - cbfunc(OPAL_SUCCESS, val, cbdata); - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_SUCCESS; - } - } - - /* create the caddy */ - op = OBJ_NEW(ext2x_opcaddy_t); - op->valcbfunc = cbfunc; - op->cbdata = cbdata; - - if (NULL == proc) { - (void)strncpy(op->p.nspace, my_proc.nspace, PMIX_MAX_NSLEN); - op->p.rank = ext2x_convert_rank(PMIX_RANK_WILDCARD); - } else { - if (NULL == (nsptr = ext2x_convert_jobid(proc->jobid))) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_FOUND; - } - (void)strncpy(op->p.nspace, nsptr, PMIX_MAX_NSLEN); - op->p.rank = ext2x_convert_opalrank(proc->vpid); - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - if (NULL != info && 0 < (op->sz = opal_list_get_size(info))) { - PMIX_INFO_CREATE(op->info, op->sz); - n=0; - OPAL_LIST_FOREACH(val, info, opal_value_t) { - (void)strncpy(op->info[n].key, val->key, PMIX_MAX_KEYLEN); - ext2x_value_load(&op->info[n].value, val); - ++n; - } - } - - /* call the library function */ - rc = PMIx_Get_nb(&op->p, key, op->info, op->sz, val_cbfunc, op); - if (PMIX_SUCCESS != rc) { - OBJ_RELEASE(op); - } - - return ext2x_convert_rc(rc); -} - -int ext2x_publish(opal_list_t *info) -{ - pmix_info_t *pinfo; - pmix_status_t ret; - opal_value_t *iptr; - size_t sz, n; - - opal_output_verbose(1, opal_pmix_base_framework.framework_output, - "PMIx_client publish"); - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - if (0 >= opal_pmix_base.initialized) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_INITIALIZED; - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - if (NULL == info) { - return OPAL_ERR_BAD_PARAM; - } - - sz = opal_list_get_size(info); - if (0 < sz) { - PMIX_INFO_CREATE(pinfo, sz); - n=0; - OPAL_LIST_FOREACH(iptr, info, opal_value_t) { - (void)strncpy(pinfo[n].key, iptr->key, PMIX_MAX_KEYLEN); - ext2x_value_load(&pinfo[n].value, iptr); - ++n; - } - } else { - pinfo = NULL; - } - - ret = PMIx_Publish(pinfo, sz); - if (0 < sz) { - PMIX_INFO_FREE(pinfo, sz); - } - - return ext2x_convert_rc(ret); -} - -int ext2x_publishnb(opal_list_t *info, - opal_pmix_op_cbfunc_t cbfunc, void *cbdata) -{ - pmix_status_t ret; - opal_value_t *iptr; - size_t n; - ext2x_opcaddy_t *op; - - opal_output_verbose(1, opal_pmix_base_framework.framework_output, - "PMIx_client publish_nb"); - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - if (0 >= opal_pmix_base.initialized) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_INITIALIZED; - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - if (NULL == info) { - return OPAL_ERR_BAD_PARAM; - } - - /* create the caddy */ - op = OBJ_NEW(ext2x_opcaddy_t); - op->opcbfunc = cbfunc; - op->cbdata = cbdata; - - op->sz = opal_list_get_size(info); - if (0 < op->sz) { - PMIX_INFO_CREATE(op->info, op->sz); - n=0; - OPAL_LIST_FOREACH(iptr, info, opal_value_t) { - (void)strncpy(op->info[n].key, iptr->key, PMIX_MAX_KEYLEN); - ext2x_value_load(&op->info[n].value, iptr); - ++n; - } - } - - ret = PMIx_Publish_nb(op->info, op->sz, opcbfunc, op); - - return ext2x_convert_rc(ret); -} - -int ext2x_lookup(opal_list_t *data, opal_list_t *info) -{ - opal_pmix_pdata_t *d; - pmix_pdata_t *pdata; - pmix_info_t *pinfo = NULL; - pmix_status_t rc; - size_t cnt, n, sz = 0; - opal_value_t *iptr; - opal_ext2x_jobid_trkr_t *jptr, *job; - int ret; - - opal_output_verbose(1, opal_pmix_base_framework.framework_output, - "ext2x:client lookup"); - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - if (0 >= opal_pmix_base.initialized) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_INITIALIZED; - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - if (NULL == data || 0 == (cnt = opal_list_get_size(data))) { - return OPAL_ERR_BAD_PARAM; - } - PMIX_PDATA_CREATE(pdata, cnt); - n = 0; - OPAL_LIST_FOREACH(d, data, opal_pmix_pdata_t) { - (void)strncpy(pdata[n].key, d->value.key, PMIX_MAX_KEYLEN); - ++n; - } - - if (NULL != info && 0 < (sz = opal_list_get_size(info))) { - PMIX_INFO_CREATE(pinfo, sz); - n=0; - OPAL_LIST_FOREACH(iptr, info, opal_value_t) { - (void)strncpy(pinfo[n].key, iptr->key, PMIX_MAX_KEYLEN); - ext2x_value_load(&pinfo[n].value, iptr); - ++n; - } - } - - rc = PMIx_Lookup(pdata, cnt, pinfo, sz); - if (PMIX_SUCCESS == rc) { - /* load the answers back into the list */ - n=0; - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - OPAL_LIST_FOREACH(d, data, opal_pmix_pdata_t) { - if (mca_pmix_ext2x_component.native_launch) { - /* if we were launched by the OMPI RTE, then - * the jobid is in a special format - so get it */ - opal_convert_string_to_jobid(&d->proc.jobid, pdata[n].proc.nspace); - } else { - /* we were launched by someone else, so make the - * jobid just be the hash of the nspace */ - OPAL_HASH_JOBID(pdata[n].proc.nspace, d->proc.jobid); - } - /* if we don't already have it, add this to our jobid tracker */ - job = NULL; - OPAL_LIST_FOREACH(jptr, &mca_pmix_ext2x_component.jobids, opal_ext2x_jobid_trkr_t) { - if (jptr->jobid == d->proc.jobid) { - job = jptr; - break; - } - } - if (NULL == job) { - job = OBJ_NEW(opal_ext2x_jobid_trkr_t); - (void)strncpy(job->nspace, pdata[n].proc.nspace, PMIX_MAX_NSLEN); - job->jobid = d->proc.jobid; - opal_list_append(&mca_pmix_ext2x_component.jobids, &job->super); - } - d->proc.vpid = ext2x_convert_rank(pdata[n].proc.rank); - if (OPAL_SUCCESS != (ret = ext2x_value_unload(&d->value, &pdata[n].value))) { - OPAL_ERROR_LOG(ret); - } - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - } - PMIX_PDATA_FREE(pdata, cnt); - if (NULL != pinfo) { - PMIX_INFO_FREE(pinfo, sz); - } - return ext2x_convert_rc(rc); -} - -static void lk_cbfunc(pmix_status_t status, - pmix_pdata_t data[], size_t ndata, - void *cbdata) -{ - ext2x_opcaddy_t *op = (ext2x_opcaddy_t*)cbdata; - opal_pmix_pdata_t *d; - opal_list_t results, *r = NULL; - int rc; - size_t n; - opal_ext2x_jobid_trkr_t *job, *jptr; - - OPAL_ACQUIRE_OBJECT(op); - - if (NULL == op->lkcbfunc) { - OBJ_RELEASE(op); - return; - } - - rc = ext2x_convert_rc(op->status); - if (OPAL_SUCCESS == rc) { - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - OBJ_CONSTRUCT(&results, opal_list_t); - for (n=0; n < ndata; n++) { - d = OBJ_NEW(opal_pmix_pdata_t); - opal_list_append(&results, &d->super); - if (mca_pmix_ext2x_component.native_launch) { - /* if we were launched by the OMPI RTE, then - * the jobid is in a special format - so get it */ - opal_convert_string_to_jobid(&d->proc.jobid, data[n].proc.nspace); - } else { - /* we were launched by someone else, so make the - * jobid just be the hash of the nspace */ - OPAL_HASH_JOBID(data[n].proc.nspace, d->proc.jobid); - } - /* if we don't already have it, add this to our jobid tracker */ - job = NULL; - OPAL_LIST_FOREACH(jptr, &mca_pmix_ext2x_component.jobids, opal_ext2x_jobid_trkr_t) { - if (jptr->jobid == d->proc.jobid) { - job = jptr; - break; - } - } - if (NULL == job) { - job = OBJ_NEW(opal_ext2x_jobid_trkr_t); - (void)strncpy(job->nspace, data[n].proc.nspace, PMIX_MAX_NSLEN); - job->jobid = d->proc.jobid; - opal_list_append(&mca_pmix_ext2x_component.jobids, &job->super); - } - d->proc.vpid = ext2x_convert_rank(data[n].proc.rank); - d->value.key = strdup(data[n].key); - rc = ext2x_value_unload(&d->value, &data[n].value); - if (OPAL_SUCCESS != rc) { - rc = OPAL_ERR_BAD_PARAM; - OPAL_ERROR_LOG(rc); - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - goto release; - } - } - r = &results; - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - } - - release: - /* execute the callback */ - op->lkcbfunc(rc, r, op->cbdata); - - if (NULL != r) { - OPAL_LIST_DESTRUCT(&results); - } - OBJ_RELEASE(op); -} - -int ext2x_lookupnb(char **keys, opal_list_t *info, - opal_pmix_lookup_cbfunc_t cbfunc, void *cbdata) -{ - pmix_status_t ret; - ext2x_opcaddy_t *op; - opal_value_t *iptr; - size_t n; - - - opal_output_verbose(1, opal_pmix_base_framework.framework_output, - "ext2x:client lookup_nb"); - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - if (0 >= opal_pmix_base.initialized) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_INITIALIZED; - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - /* create the caddy */ - op = OBJ_NEW(ext2x_opcaddy_t); - op->lkcbfunc = cbfunc; - op->cbdata = cbdata; - - if (NULL != info && 0 < (op->sz = opal_list_get_size(info))) { - PMIX_INFO_CREATE(op->info, op->sz); - n=0; - OPAL_LIST_FOREACH(iptr, info, opal_value_t) { - (void)strncpy(op->info[n].key, iptr->key, PMIX_MAX_KEYLEN); - ext2x_value_load(&op->info[n].value, iptr); - ++n; - } - } - ret = PMIx_Lookup_nb(keys, op->info, op->sz, lk_cbfunc, op); - - return ext2x_convert_rc(ret); -} - -int ext2x_unpublish(char **keys, opal_list_t *info) -{ - pmix_status_t ret; - size_t ninfo, n; - pmix_info_t *pinfo; - opal_value_t *iptr; - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - if (0 >= opal_pmix_base.initialized) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_INITIALIZED; - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - if (NULL != info && 0 < (ninfo = opal_list_get_size(info))) { - PMIX_INFO_CREATE(pinfo, ninfo); - n=0; - OPAL_LIST_FOREACH(iptr, info, opal_value_t) { - (void)strncpy(pinfo[n].key, iptr->key, PMIX_MAX_KEYLEN); - ext2x_value_load(&pinfo[n].value, iptr); - ++n; - } - } else { - pinfo = NULL; - ninfo = 0; - } - - ret = PMIx_Unpublish(keys, pinfo, ninfo); - PMIX_INFO_FREE(pinfo, ninfo); - - return ext2x_convert_rc(ret); -} - -int ext2x_unpublishnb(char **keys, opal_list_t *info, - opal_pmix_op_cbfunc_t cbfunc, void *cbdata) -{ - pmix_status_t ret; - ext2x_opcaddy_t *op; - opal_value_t *iptr; - size_t n; - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - if (0 >= opal_pmix_base.initialized) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_INITIALIZED; - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - /* create the caddy */ - op = OBJ_NEW(ext2x_opcaddy_t); - op->opcbfunc = cbfunc; - op->cbdata = cbdata; - - if (NULL != info && 0 < (op->sz = opal_list_get_size(info))) { - PMIX_INFO_CREATE(op->info, op->sz); - n=0; - OPAL_LIST_FOREACH(iptr, info, opal_value_t) { - (void)strncpy(op->info[n].key, iptr->key, PMIX_MAX_KEYLEN); - ext2x_value_load(&op->info[n].value, iptr); - ++n; - } - } - - ret = PMIx_Unpublish_nb(keys, op->info, op->sz, opcbfunc, op); - - return ext2x_convert_rc(ret); -} - -int ext2x_spawn(opal_list_t *job_info, opal_list_t *apps, opal_jobid_t *jobid) -{ - pmix_status_t rc; - pmix_info_t *info = NULL; - pmix_app_t *papps; - size_t ninfo = 0, napps, n, m; - opal_value_t *ival; - opal_pmix_app_t *app; - char nspace[PMIX_MAX_NSLEN+1]; - opal_ext2x_jobid_trkr_t *job; - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - if (0 >= opal_pmix_base.initialized) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_INITIALIZED; - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - *jobid = OPAL_JOBID_INVALID; - - if (NULL != job_info && 0 < (ninfo = opal_list_get_size(job_info))) { - PMIX_INFO_CREATE(info, ninfo); - n=0; - OPAL_LIST_FOREACH(ival, job_info, opal_value_t) { - (void)strncpy(info[n].key, ival->key, PMIX_MAX_KEYLEN); - ext2x_value_load(&info[n].value, ival); - ++n; - } - } - - napps = opal_list_get_size(apps); - PMIX_APP_CREATE(papps, napps); - n=0; - OPAL_LIST_FOREACH(app, apps, opal_pmix_app_t) { - papps[n].cmd = strdup(app->cmd); - if (NULL != app->argv) { - papps[n].argv = opal_argv_copy(app->argv); - } - if (NULL != app->env) { - papps[n].env = opal_argv_copy(app->env); - } - papps[n].maxprocs = app->maxprocs; - if (0 < (papps[n].ninfo = opal_list_get_size(&app->info))) { - PMIX_INFO_CREATE(papps[n].info, papps[n].ninfo); - m=0; - OPAL_LIST_FOREACH(ival, &app->info, opal_value_t) { - (void)strncpy(papps[n].info[m].key, ival->key, PMIX_MAX_KEYLEN); - ext2x_value_load(&papps[n].info[m].value, ival); - ++m; - } - } - ++n; - } - - rc = PMIx_Spawn(info, ninfo, papps, napps, nspace); - if (PMIX_SUCCESS == rc) { - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - if (mca_pmix_ext2x_component.native_launch) { - /* if we were launched by the OMPI RTE, then - * the jobid is in a special format - so get it */ - opal_convert_string_to_jobid(jobid, nspace); - } else { - /* we were launched by someone else, so make the - * jobid just be the hash of the nspace */ - OPAL_HASH_JOBID(nspace, *jobid); - } - /* add this to our jobid tracker */ - job = OBJ_NEW(opal_ext2x_jobid_trkr_t); - (void)strncpy(job->nspace, nspace, PMIX_MAX_NSLEN); - job->jobid = *jobid; - opal_list_append(&mca_pmix_ext2x_component.jobids, &job->super); - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - } - return rc; -} - -static void spcbfunc(pmix_status_t status, - char *nspace, void *cbdata) -{ - ext2x_opcaddy_t *op = (ext2x_opcaddy_t*)cbdata; - opal_ext2x_jobid_trkr_t *job; - opal_jobid_t jobid = OPAL_JOBID_INVALID; - int rc; - - OPAL_ACQUIRE_OBJECT(op); - - rc = ext2x_convert_rc(status); - if (PMIX_SUCCESS == status) { - /* this is in the PMIx local thread - need to protect - * the framework-level data */ - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - if (mca_pmix_ext2x_component.native_launch) { - /* if we were launched by the OMPI RTE, then - * the jobid is in a special format - so get it */ - opal_convert_string_to_jobid(&jobid, nspace); - } else { - /* we were launched by someone else, so make the - * jobid just be the hash of the nspace */ - OPAL_HASH_JOBID(nspace, jobid); - } - /* add this to our jobid tracker */ - job = OBJ_NEW(opal_ext2x_jobid_trkr_t); - (void)strncpy(job->nspace, nspace, PMIX_MAX_NSLEN); - job->jobid = jobid; - opal_list_append(&mca_pmix_ext2x_component.jobids, &job->super); - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - } - - op->spcbfunc(rc, jobid, op->cbdata); - OBJ_RELEASE(op); -} - -int ext2x_spawnnb(opal_list_t *job_info, opal_list_t *apps, - opal_pmix_spawn_cbfunc_t cbfunc, void *cbdata) -{ - pmix_status_t ret; - ext2x_opcaddy_t *op; - size_t n, m; - opal_value_t *info; - opal_pmix_app_t *app; - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - if (0 >= opal_pmix_base.initialized) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_INITIALIZED; - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - /* create the caddy */ - op = OBJ_NEW(ext2x_opcaddy_t); - op->spcbfunc = cbfunc; - op->cbdata = cbdata; - - if (NULL != job_info && 0 < (op->ninfo = opal_list_get_size(job_info))) { - PMIX_INFO_CREATE(op->info, op->ninfo); - n=0; - OPAL_LIST_FOREACH(info, job_info, opal_value_t) { - (void)strncpy(op->info[n].key, info->key, PMIX_MAX_KEYLEN); - ext2x_value_load(&op->info[n].value, info); - ++n; - } - } - - op->sz = opal_list_get_size(apps); - PMIX_APP_CREATE(op->apps, op->sz); - n=0; - OPAL_LIST_FOREACH(app, apps, opal_pmix_app_t) { - op->apps[n].cmd = strdup(app->cmd); - if (NULL != app->argv) { - op->apps[n].argv = opal_argv_copy(app->argv); - } - if (NULL != app->env) { - op->apps[n].env = opal_argv_copy(app->env); - } - op->apps[n].maxprocs = app->maxprocs; - if (0 < (op->apps[n].ninfo = opal_list_get_size(&app->info))) { - PMIX_INFO_CREATE(op->apps[n].info, op->apps[n].ninfo); - m=0; - OPAL_LIST_FOREACH(info, &app->info, opal_value_t) { - (void)strncpy(op->apps[n].info[m].key, info->key, PMIX_MAX_KEYLEN); - ext2x_value_load(&op->apps[n].info[m].value, info); - ++m; - } - } - ++n; - } - - ret = PMIx_Spawn_nb(op->info, op->ninfo, op->apps, op->sz, spcbfunc, op); - - return ext2x_convert_rc(ret); -} - -int ext2x_connect(opal_list_t *procs) -{ - pmix_proc_t *p; - size_t nprocs; - opal_namelist_t *ptr; - pmix_status_t ret; - char *nsptr; - size_t n; - - opal_output_verbose(1, opal_pmix_base_framework.framework_output, - "ext2x:client connect"); - - /* protect against bozo error */ - if (NULL == procs || 0 == (nprocs = opal_list_get_size(procs))) { - return OPAL_ERR_BAD_PARAM; - } - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - if (0 >= opal_pmix_base.initialized) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_INITIALIZED; - } - - /* convert the list of procs to an array - * of pmix_proc_t */ - PMIX_PROC_CREATE(p, nprocs); - n=0; - OPAL_LIST_FOREACH(ptr, procs, opal_namelist_t) { - if (NULL == (nsptr = ext2x_convert_jobid(ptr->name.jobid))) { - PMIX_PROC_FREE(p, nprocs); - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_FOUND; - } - (void)strncpy(p[n].nspace, nsptr, PMIX_MAX_NSLEN); - p[n].rank = ext2x_convert_opalrank(ptr->name.vpid); - ++n; - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - ret = PMIx_Connect(p, nprocs, NULL, 0); - PMIX_PROC_FREE(p, nprocs); - - return ext2x_convert_rc(ret); -} - -int ext2x_connectnb(opal_list_t *procs, - opal_pmix_op_cbfunc_t cbfunc, - void *cbdata) -{ - ext2x_opcaddy_t *op; - opal_namelist_t *ptr; - pmix_status_t ret; - char *nsptr; - size_t n; - - opal_output_verbose(1, opal_pmix_base_framework.framework_output, - "ext2x:client connect NB"); - - /* protect against bozo error */ - if (NULL == procs || 0 == opal_list_get_size(procs)) { - return OPAL_ERR_BAD_PARAM; - } - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - if (0 >= opal_pmix_base.initialized) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_INITIALIZED; - } - - /* create the caddy */ - op = OBJ_NEW(ext2x_opcaddy_t); - op->opcbfunc = cbfunc; - op->cbdata = cbdata; - op->nprocs = opal_list_get_size(procs); - - /* convert the list of procs to an array - * of pmix_proc_t */ - PMIX_PROC_CREATE(op->procs, op->nprocs); - n=0; - OPAL_LIST_FOREACH(ptr, procs, opal_namelist_t) { - if (NULL == (nsptr = ext2x_convert_jobid(ptr->name.jobid))) { - OBJ_RELEASE(op); - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_FOUND; - } - (void)strncpy(op->procs[n].nspace, nsptr, PMIX_MAX_NSLEN); - op->procs[n].rank = ext2x_convert_opalrank(ptr->name.vpid); - ++n; - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - ret = PMIx_Connect_nb(op->procs, op->nprocs, NULL, 0, opcbfunc, op); - if (PMIX_SUCCESS != ret) { - OBJ_RELEASE(op); - } - return ext2x_convert_rc(ret); -} - -int ext2x_disconnect(opal_list_t *procs) -{ - pmix_proc_t *p; - size_t nprocs; - opal_namelist_t *ptr; - pmix_status_t ret; - char *nsptr; - size_t n; - - opal_output_verbose(1, opal_pmix_base_framework.framework_output, - "ext2x:client disconnect"); - - /* protect against bozo error */ - if (NULL == procs || 0 == (nprocs = opal_list_get_size(procs))) { - return OPAL_ERR_BAD_PARAM; - } - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - if (0 >= opal_pmix_base.initialized) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_INITIALIZED; - } - - /* convert the list of procs to an array - * of pmix_proc_t */ - PMIX_PROC_CREATE(p, nprocs); - n=0; - OPAL_LIST_FOREACH(ptr, procs, opal_namelist_t) { - if (NULL == (nsptr = ext2x_convert_jobid(ptr->name.jobid))) { - PMIX_PROC_FREE(p, nprocs); - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_FOUND; - } - (void)strncpy(p[n].nspace, nsptr, PMIX_MAX_NSLEN); - p[n].rank = ext2x_convert_opalrank(ptr->name.vpid); - ++n; - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - ret = PMIx_Disconnect(p, nprocs, NULL, 0); - PMIX_PROC_FREE(p, nprocs); - - return ext2x_convert_rc(ret); -} - -int ext2x_disconnectnb(opal_list_t *procs, - opal_pmix_op_cbfunc_t cbfunc, - void *cbdata) -{ - ext2x_opcaddy_t *op; - opal_namelist_t *ptr; - pmix_status_t ret; - char *nsptr; - size_t n; - - opal_output_verbose(1, opal_pmix_base_framework.framework_output, - "ext2x:client disconnect NB"); - - /* protect against bozo error */ - if (NULL == procs || 0 == opal_list_get_size(procs)) { - return OPAL_ERR_BAD_PARAM; - } - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - if (0 >= opal_pmix_base.initialized) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_INITIALIZED; - } - - /* create the caddy */ - op = OBJ_NEW(ext2x_opcaddy_t); - op->opcbfunc = cbfunc; - op->cbdata = cbdata; - op->nprocs = opal_list_get_size(procs); - - /* convert the list of procs to an array - * of pmix_proc_t */ - PMIX_PROC_CREATE(op->procs, op->nprocs); - n=0; - OPAL_LIST_FOREACH(ptr, procs, opal_namelist_t) { - if (NULL == (nsptr = ext2x_convert_jobid(ptr->name.jobid))) { - OBJ_RELEASE(op); - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_FOUND; - } - (void)strncpy(op->procs[n].nspace, nsptr, PMIX_MAX_NSLEN); - op->procs[n].rank = ext2x_convert_opalrank(ptr->name.vpid); - ++n; - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - ret = PMIx_Disconnect_nb(op->procs, op->nprocs, NULL, 0, opcbfunc, op); - if (PMIX_SUCCESS != ret) { - OBJ_RELEASE(op); - } - return ext2x_convert_rc(ret); -} - -int ext2x_resolve_peers(const char *nodename, - opal_jobid_t jobid, - opal_list_t *procs) -{ - pmix_status_t ret; - char *nspace; - pmix_proc_t *array=NULL; - size_t nprocs, n; - opal_namelist_t *nm; - opal_ext2x_jobid_trkr_t *job; - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - if (0 >= opal_pmix_base.initialized) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_INITIALIZED; - } - - if (OPAL_JOBID_WILDCARD != jobid) { - if (NULL == (nspace = ext2x_convert_jobid(jobid))) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_FOUND; - } - } else { - nspace = NULL; - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - ret = PMIx_Resolve_peers(nodename, nspace, &array, &nprocs); - - if (NULL != array && 0 < nprocs) { - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - for (n=0; n < nprocs; n++) { - nm = OBJ_NEW(opal_namelist_t); - opal_list_append(procs, &nm->super); - if (mca_pmix_ext2x_component.native_launch) { - /* if we were launched by the OMPI RTE, then - * the jobid is in a special format - so get it */ - opal_convert_string_to_jobid(&nm->name.jobid, array[n].nspace); - } else { - /* we were launched by someone else, so make the - * jobid just be the hash of the nspace */ - OPAL_HASH_JOBID(array[n].nspace, nm->name.jobid); - } - /* if we don't already have it, add this to our jobid tracker */ - if (NULL == ext2x_convert_jobid(nm->name.jobid)) { - job = OBJ_NEW(opal_ext2x_jobid_trkr_t); - (void)strncpy(job->nspace, array[n].nspace, PMIX_MAX_NSLEN); - job->jobid = nm->name.jobid; - opal_list_append(&mca_pmix_ext2x_component.jobids, &job->super); - } - nm->name.vpid = ext2x_convert_rank(array[n].rank); - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - } - PMIX_PROC_FREE(array, nprocs); - return ext2x_convert_rc(ret); -} - -int ext2x_resolve_nodes(opal_jobid_t jobid, char **nodelist) -{ - pmix_status_t ret; - char *nsptr; - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - if (0 >= opal_pmix_base.initialized) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_INITIALIZED; - } - - if (NULL == (nsptr = ext2x_convert_jobid(jobid))) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_FOUND; - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - ret = PMIx_Resolve_nodes(nsptr, nodelist); - - return ext2x_convert_rc(ret); -} diff --git a/opal/mca/pmix/ext2x/pmix2x_component.c b/opal/mca/pmix/ext2x/pmix2x_component.c deleted file mode 100644 index 4ac5e8ffa2..0000000000 --- a/opal/mca/pmix/ext2x/pmix2x_component.c +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (c) 2014-2017 Intel, Inc. All rights reserved. - * Copyright (c) 2014-2015 Research Organization for Information Science - * and Technology (RIST). All rights reserved. - * Copyright (c) 2016 Cisco Systems, Inc. All rights reserved. - * $COPYRIGHT$ - * - * Additional copyrights may follow - * - * $HEADER$ - * - * These symbols are in a file by themselves to provide nice linker - * semantics. Since linkers generally pull in symbols by object - * files, keeping these symbols as the only symbols in this file - * prevents utility programs such as "ompi_info" from having to import - * entire components just to query their version and parameters. - */ - -#include "opal_config.h" - -#include "opal/constants.h" -#include "opal/class/opal_list.h" -#include "opal/util/proc.h" -#include "opal/mca/pmix/pmix.h" -#include "pmix2x.h" - -/* - * Public string showing the pmix external component version number - */ -const char *opal_pmix_ext2x_component_version_string = - "OPAL ext2x MCA component version " OPAL_VERSION; - -/* - * Local function - */ -static int external_register(void); -static int external_open(void); -static int external_close(void); -static int external_component_query(mca_base_module_t **module, int *priority); - - -/* - * Instantiate the public struct with all of our public information - * and pointers to our public functions in it - */ - -mca_pmix_ext2x_component_t mca_pmix_ext2x_component = { - { - /* First, the mca_component_t struct containing meta information - about the component itself */ - - .base_version = { - /* Indicate that we are a pmix v1.1.0 component (which also - implies a specific MCA version) */ - - OPAL_PMIX_BASE_VERSION_2_0_0, - - /* Component name and version */ - - .mca_component_name = "ext2x", - MCA_BASE_MAKE_VERSION(component, OPAL_MAJOR_VERSION, OPAL_MINOR_VERSION, - OPAL_RELEASE_VERSION), - - /* Component open and close functions */ - - .mca_open_component = external_open, - .mca_close_component = external_close, - .mca_query_component = external_component_query, - .mca_register_component_params = external_register - }, - /* Next the MCA v1.0.0 component meta data */ - .base_data = { - /* The component is checkpoint ready */ - MCA_BASE_METADATA_PARAM_CHECKPOINT - } - }, - .native_launch = false -}; - -static int external_register(void) -{ - mca_base_component_t *component = &mca_pmix_ext2x_component.super.base_version; - - mca_pmix_ext2x_component.silence_warning = false; - (void) mca_base_component_var_register (component, "silence_warning", - "Silence warning about PMIX_INSTALL_PREFIX", - MCA_BASE_VAR_TYPE_BOOL, NULL, 0, 0, - OPAL_INFO_LVL_4, - MCA_BASE_VAR_SCOPE_READONLY, - &mca_pmix_ext2x_component.silence_warning); - - return OPAL_SUCCESS; -} - -static int external_open(void) -{ - mca_pmix_ext2x_component.evindex = 0; - OBJ_CONSTRUCT(&mca_pmix_ext2x_component.jobids, opal_list_t); - OBJ_CONSTRUCT(&mca_pmix_ext2x_component.events, opal_list_t); - OBJ_CONSTRUCT(&mca_pmix_ext2x_component.dmdx, opal_list_t); - - return OPAL_SUCCESS; -} - -static int external_close(void) -{ - OPAL_LIST_DESTRUCT(&mca_pmix_ext2x_component.jobids); - OPAL_LIST_DESTRUCT(&mca_pmix_ext2x_component.events); - OPAL_LIST_DESTRUCT(&mca_pmix_ext2x_component.dmdx); - return OPAL_SUCCESS; -} - - -static int external_component_query(mca_base_module_t **module, int *priority) -{ - char *t, *id; - - /* see if a PMIx server is present */ - if (NULL != (t = getenv("PMIX_SERVER_URI")) || - NULL != (id = getenv("PMIX_ID"))) { - /* if PMIx is present, then we are a client and need to use it */ - *priority = 100; - } else { - /* we could be a server, so we still need to be considered */ - *priority = 5; - } - *module = (mca_base_module_t *)&opal_pmix_ext2x_module; - return OPAL_SUCCESS; -} diff --git a/opal/mca/pmix/ext2x/pmix2x_server_north.c b/opal/mca/pmix/ext2x/pmix2x_server_north.c deleted file mode 100644 index ebb86ff297..0000000000 --- a/opal/mca/pmix/ext2x/pmix2x_server_north.c +++ /dev/null @@ -1,1262 +0,0 @@ -/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */ -/* - * Copyright (c) 2014-2017 Intel, Inc. All rights reserved. - * Copyright (c) 2014-2017 Research Organization for Information Science - * and Technology (RIST). All rights reserved. - * Copyright (c) 2014-2015 Mellanox Technologies, Inc. - * All rights reserved. - * Copyright (c) 2016 Cisco Systems, Inc. All rights reserved. - * $COPYRIGHT$ - * - * Additional copyrights may follow - * - * $HEADER$ - */ - -#include "opal_config.h" -#include "opal/constants.h" -#include "opal/types.h" - -#ifdef HAVE_STRING_H -#include -#endif -#ifdef HAVE_UNISTD_H -#include -#endif - -#include "opal/dss/dss.h" -#include "opal/mca/event/event.h" -#include "opal/mca/hwloc/base/base.h" -#include "opal/runtime/opal.h" -#include "opal/runtime/opal_progress_threads.h" -#include "opal/threads/threads.h" -#include "opal/util/argv.h" -#include "opal/util/error.h" -#include "opal/util/output.h" -#include "opal/util/proc.h" -#include "opal/util/show_help.h" -#include "opal/mca/pmix/base/base.h" -#include "pmix2x.h" - -#include "pmix.h" -#include "pmix_server.h" - -/**** N.O.R.T.H.B.O.U.N.D I.N.T.E.R.F.A.C.E.S ****/ - -/* These are the interfaces used by the embedded PMIx server - * to call up into ORTE for service requests */ - -static pmix_status_t server_client_connected_fn(const pmix_proc_t *proc, void* server_object, - pmix_op_cbfunc_t cbfunc, void *cbdata); -static pmix_status_t server_client_finalized_fn(const pmix_proc_t *proc, void* server_object, - pmix_op_cbfunc_t cbfunc, void *cbdata); -static pmix_status_t server_abort_fn(const pmix_proc_t *proc, void *server_object, - int status, const char msg[], - pmix_proc_t procs[], size_t nprocs, - pmix_op_cbfunc_t cbfunc, void *cbdata); -static pmix_status_t server_fencenb_fn(const pmix_proc_t procs[], size_t nprocs, - const pmix_info_t info[], size_t ninfo, - char *data, size_t ndata, - pmix_modex_cbfunc_t cbfunc, void *cbdata); -static pmix_status_t server_dmodex_req_fn(const pmix_proc_t *proc, - const pmix_info_t info[], size_t ninfo, - pmix_modex_cbfunc_t cbfunc, void *cbdata); -static pmix_status_t server_publish_fn(const pmix_proc_t *proc, - const pmix_info_t info[], size_t ninfo, - pmix_op_cbfunc_t cbfunc, void *cbdata); -static pmix_status_t server_lookup_fn(const pmix_proc_t *proc, char **keys, - const pmix_info_t info[], size_t ninfo, - pmix_lookup_cbfunc_t cbfunc, void *cbdata); -static pmix_status_t server_unpublish_fn(const pmix_proc_t *proc, char **keys, - const pmix_info_t info[], size_t ninfo, - pmix_op_cbfunc_t cbfunc, void *cbdata); -static pmix_status_t server_spawn_fn(const pmix_proc_t *proc, - const pmix_info_t job_info[], size_t ninfo, - const pmix_app_t apps[], size_t napps, - pmix_spawn_cbfunc_t cbfunc, void *cbdata); -static pmix_status_t server_connect_fn(const pmix_proc_t procs[], size_t nprocs, - const pmix_info_t info[], size_t ninfo, - pmix_op_cbfunc_t cbfunc, void *cbdata); -static pmix_status_t server_disconnect_fn(const pmix_proc_t procs[], size_t nprocs, - const pmix_info_t info[], size_t ninfo, - pmix_op_cbfunc_t cbfunc, void *cbdata); -static pmix_status_t server_register_events(pmix_status_t *codes, size_t ncodes, - const pmix_info_t info[], size_t ninfo, - pmix_op_cbfunc_t cbfunc, void *cbdata); -static pmix_status_t server_deregister_events(pmix_status_t *codes, size_t ncodes, - pmix_op_cbfunc_t cbfunc, void *cbdata); -static pmix_status_t server_notify_event(pmix_status_t code, - const pmix_proc_t *source, - pmix_data_range_t range, - pmix_info_t info[], size_t ninfo, - pmix_op_cbfunc_t cbfunc, void *cbdata); -static pmix_status_t server_query(pmix_proc_t *proct, - pmix_query_t *queryies, size_t nqueries, - pmix_info_cbfunc_t cbfunc, - void *cbdata); -static void server_tool_connection(pmix_info_t *info, size_t ninfo, - pmix_tool_connection_cbfunc_t cbfunc, - void *cbdata); -static void server_log(const pmix_proc_t *client, - const pmix_info_t data[], size_t ndata, - const pmix_info_t directives[], size_t ndirs, - pmix_op_cbfunc_t cbfunc, void *cbdata); - -static pmix_status_t server_allocate(const pmix_proc_t *client, - pmix_alloc_directive_t directive, - const pmix_info_t data[], size_t ndata, - pmix_info_cbfunc_t cbfunc, void *cbdata); - -static pmix_status_t server_job_control(const pmix_proc_t *requestor, - const pmix_proc_t targets[], size_t ntargets, - const pmix_info_t directives[], size_t ndirs, - pmix_info_cbfunc_t cbfunc, void *cbdata); - -pmix_server_module_t mymodule = { - .client_connected = server_client_connected_fn, - .client_finalized = server_client_finalized_fn, - .abort = server_abort_fn, - .fence_nb = server_fencenb_fn, - .direct_modex = server_dmodex_req_fn, - .publish = server_publish_fn, - .lookup = server_lookup_fn, - .unpublish = server_unpublish_fn, - .spawn = server_spawn_fn, - .connect = server_connect_fn, - .disconnect = server_disconnect_fn, - .register_events = server_register_events, - .deregister_events = server_deregister_events, - .notify_event = server_notify_event, - .query = server_query, - .tool_connected = server_tool_connection, - .log = server_log, - .allocate = server_allocate, - .job_control = server_job_control - /* we do not support monitoring, but use the - * PMIx internal monitoring capability */ -}; - -opal_pmix_server_module_t *host_module = NULL; - - -static void opal_opcbfunc(int status, void *cbdata) -{ - ext2x_opalcaddy_t *opalcaddy = (ext2x_opalcaddy_t*)cbdata; - - OPAL_ACQUIRE_OBJECT(opalcaddy); - if (NULL != opalcaddy->opcbfunc) { - opalcaddy->opcbfunc(ext2x_convert_opalrc(status), opalcaddy->cbdata); - } - OBJ_RELEASE(opalcaddy); -} - -static pmix_status_t server_client_connected_fn(const pmix_proc_t *p, void *server_object, - pmix_op_cbfunc_t cbfunc, void *cbdata) -{ - int rc; - opal_process_name_t proc; - ext2x_opalcaddy_t *opalcaddy; - - if (NULL == host_module || NULL == host_module->client_connected) { - return PMIX_SUCCESS; - } - - opalcaddy = OBJ_NEW(ext2x_opalcaddy_t); - opalcaddy->opcbfunc = cbfunc; - opalcaddy->cbdata = cbdata; - - /* convert the nspace/rank to an opal_process_name_t */ - if (OPAL_SUCCESS != (rc = opal_convert_string_to_jobid(&proc.jobid, p->nspace))) { - return ext2x_convert_opalrc(rc); - } - proc.vpid = ext2x_convert_rank(p->rank); - - /* pass it up */ - rc = host_module->client_connected(&proc, server_object, - opal_opcbfunc, opalcaddy); - return ext2x_convert_opalrc(rc); -} - -static pmix_status_t server_client_finalized_fn(const pmix_proc_t *p, void* server_object, - pmix_op_cbfunc_t cbfunc, void *cbdata) -{ - int rc; - ext2x_opalcaddy_t *opalcaddy; - opal_process_name_t proc; - - if (NULL == host_module || NULL == host_module->client_finalized) { - return PMIX_SUCCESS; - } - - /* convert the nspace/rank to an opal_process_name_t */ - if (OPAL_SUCCESS != (rc = opal_convert_string_to_jobid(&proc.jobid, p->nspace))) { - return ext2x_convert_opalrc(rc); - } - proc.vpid = ext2x_convert_rank(p->rank); - - /* setup the caddy */ - opalcaddy = OBJ_NEW(ext2x_opalcaddy_t); - opalcaddy->opcbfunc = cbfunc; - opalcaddy->cbdata = cbdata; - - /* pass it up */ - opal_output_verbose(3, opal_pmix_base_framework.framework_output, - "%s CLIENT %s FINALIZED", - OPAL_NAME_PRINT(OPAL_PROC_MY_NAME), - OPAL_NAME_PRINT(proc)); - rc = host_module->client_finalized(&proc, server_object, opal_opcbfunc, opalcaddy); - if (OPAL_SUCCESS != rc) { - OBJ_RELEASE(opalcaddy); - } - return ext2x_convert_opalrc(rc); -} - -static pmix_status_t server_abort_fn(const pmix_proc_t *p, void *server_object, - int status, const char msg[], - pmix_proc_t procs[], size_t nprocs, - pmix_op_cbfunc_t cbfunc, void *cbdata) -{ - size_t n; - opal_namelist_t *nm; - opal_process_name_t proc; - int rc; - ext2x_opalcaddy_t *opalcaddy; - - if (NULL == host_module || NULL == host_module->abort) { - return PMIX_ERR_NOT_SUPPORTED; - } - - /* convert the nspace/rank to an opal_process_name_t */ - if (OPAL_SUCCESS != (rc = opal_convert_string_to_jobid(&proc.jobid, p->nspace))) { - return ext2x_convert_opalrc(rc); - } - proc.vpid = ext2x_convert_rank(p->rank); - - opal_output_verbose(3, opal_pmix_base_framework.framework_output, - "%s CLIENT %s CALLED ABORT", - OPAL_NAME_PRINT(OPAL_PROC_MY_NAME), - OPAL_NAME_PRINT(proc)); - - /* setup the caddy */ - opalcaddy = OBJ_NEW(ext2x_opalcaddy_t); - opalcaddy->opcbfunc = cbfunc; - opalcaddy->cbdata = cbdata; - - /* convert the array of pmix_proc_t to the list of procs */ - for (n=0; n < nprocs; n++) { - nm = OBJ_NEW(opal_namelist_t); - opal_list_append(&opalcaddy->procs, &nm->super); - if (OPAL_SUCCESS != (rc = opal_convert_string_to_jobid(&nm->name.jobid, procs[n].nspace))) { - OBJ_RELEASE(opalcaddy); - return ext2x_convert_opalrc(rc); - } - nm->name.vpid = ext2x_convert_rank(procs[n].rank); - } - - /* pass it up */ - rc = host_module->abort(&proc, server_object, status, msg, - &opalcaddy->procs, opal_opcbfunc, opalcaddy); - if (OPAL_SUCCESS != rc) { - OBJ_RELEASE(opalcaddy); - } - return ext2x_convert_opalrc(rc); -} - -static void _data_release(void *cbdata) -{ - ext2x_opalcaddy_t *opalcaddy = (ext2x_opalcaddy_t*)cbdata; - - if (NULL != opalcaddy->odmdxfunc) { - opalcaddy->odmdxfunc(opalcaddy->ocbdata); - } - OBJ_RELEASE(opalcaddy); -} - -static void opmdx_response(int status, const char *data, size_t sz, void *cbdata, - opal_pmix_release_cbfunc_t relcbfunc, void *relcbdata) -{ - pmix_status_t rc; - ext2x_opalcaddy_t *opalcaddy = (ext2x_opalcaddy_t*)cbdata; - opal_ext2x_dmx_trkr_t *dmdx; - - rc = ext2x_convert_rc(status); - if (NULL != opalcaddy->mdxcbfunc) { - opalcaddy->odmdxfunc = relcbfunc; - opalcaddy->ocbdata = relcbdata; - opalcaddy->mdxcbfunc(rc, data, sz, opalcaddy->cbdata, - _data_release, opalcaddy); - /* if we were collecting all data, then check for any pending - * dmodx requests that we cached and notify them that the - * data has arrived */ - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - while (NULL != (dmdx = (opal_ext2x_dmx_trkr_t*)opal_list_remove_first(&mca_pmix_ext2x_component.dmdx))) { - dmdx->cbfunc(PMIX_SUCCESS, NULL, 0, dmdx->cbdata, NULL, NULL); - OBJ_RELEASE(dmdx); - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - } else { - OBJ_RELEASE(opalcaddy); - } -} - -static pmix_status_t server_fencenb_fn(const pmix_proc_t procs[], size_t nprocs, - const pmix_info_t info[], size_t ninfo, - char *data, size_t ndata, - pmix_modex_cbfunc_t cbfunc, void *cbdata) -{ - ext2x_opalcaddy_t *opalcaddy; - size_t n; - opal_namelist_t *nm; - opal_value_t *iptr; - int rc; - - opal_output_verbose(3, opal_pmix_base_framework.framework_output, - "%s FENCE CALLED", OPAL_NAME_PRINT(OPAL_PROC_MY_NAME)); - - if (NULL == host_module || NULL == host_module->fence_nb) { - return PMIX_ERR_NOT_SUPPORTED; - } - /* setup the caddy */ - opalcaddy = OBJ_NEW(ext2x_opalcaddy_t); - opalcaddy->mdxcbfunc = cbfunc; - opalcaddy->cbdata = cbdata; - - /* convert the array of pmix_proc_t to the list of procs */ - for (n=0; n < nprocs; n++) { - nm = OBJ_NEW(opal_namelist_t); - opal_list_append(&opalcaddy->procs, &nm->super); - if (OPAL_SUCCESS != (rc = opal_convert_string_to_jobid(&nm->name.jobid, procs[n].nspace))) { - OBJ_RELEASE(opalcaddy); - return ext2x_convert_opalrc(rc); - } - nm->name.vpid = ext2x_convert_rank(procs[n].rank); - } - - /* convert the array of pmix_info_t to the list of info */ - for (n=0; n < ninfo; n++) { - iptr = OBJ_NEW(opal_value_t); - opal_list_append(&opalcaddy->info, &iptr->super); - iptr->key = strdup(info[n].key); - if (OPAL_SUCCESS != (rc = ext2x_value_unload(iptr, &info[n].value))) { - OBJ_RELEASE(opalcaddy); - return ext2x_convert_opalrc(rc); - } - } - - /* pass it up */ - rc = host_module->fence_nb(&opalcaddy->procs, &opalcaddy->info, - data, ndata, opmdx_response, opalcaddy); - if (OPAL_SUCCESS != rc) { - OBJ_RELEASE(opalcaddy); - } - return ext2x_convert_opalrc(rc); -} - -static pmix_status_t server_dmodex_req_fn(const pmix_proc_t *p, - const pmix_info_t info[], size_t ninfo, - pmix_modex_cbfunc_t cbfunc, void *cbdata) -{ - int rc; - ext2x_opalcaddy_t *opalcaddy; - opal_process_name_t proc; - opal_value_t *iptr; - size_t n; - opal_ext2x_dmx_trkr_t *dmdx; - - if (NULL == host_module || NULL == host_module->direct_modex) { - return PMIX_ERR_NOT_SUPPORTED; - } - - /* convert the nspace/rank to an opal_process_name_t */ - if (OPAL_SUCCESS != (rc = opal_convert_string_to_jobid(&proc.jobid, p->nspace))) { - return ext2x_convert_opalrc(rc); - } - proc.vpid = ext2x_convert_rank(p->rank); - - opal_output_verbose(3, opal_pmix_base_framework.framework_output, - "%s CLIENT %s CALLED DMODX", - OPAL_NAME_PRINT(OPAL_PROC_MY_NAME), - OPAL_NAME_PRINT(proc)); - - /* setup the caddy */ - opalcaddy = OBJ_NEW(ext2x_opalcaddy_t); - opalcaddy->mdxcbfunc = cbfunc; - opalcaddy->cbdata = cbdata; - - /* this function should only get called if we are in an async modex. - * If we are also collecting data, then the fence_nb will eventually - * complete and return all the required data down to the pmix - * server beneath us. Thus, we only need to track the dmodex_req - * and ensure that the release gets called once the data has - * arrived - this will trigger the pmix server to tell the - * client that the data is available */ - if (opal_pmix_base_async_modex && opal_pmix_collect_all_data) { - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - dmdx = OBJ_NEW(opal_ext2x_dmx_trkr_t); - dmdx->cbfunc = cbfunc; - dmdx->cbdata = cbdata; - opal_list_append(&mca_pmix_ext2x_component.dmdx, &dmdx->super); - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return PMIX_SUCCESS; - } - - /* convert the array of pmix_info_t to the list of info */ - for (n=0; n < ninfo; n++) { - iptr = OBJ_NEW(opal_value_t); - opal_list_append(&opalcaddy->info, &iptr->super); - iptr->key = strdup(info[n].key); - if (OPAL_SUCCESS != (rc = ext2x_value_unload(iptr, &info[n].value))) { - OBJ_RELEASE(opalcaddy); - return ext2x_convert_opalrc(rc); - } - } - - /* pass it up */ - rc = host_module->direct_modex(&proc, &opalcaddy->info, opmdx_response, opalcaddy); - if (OPAL_SUCCESS != rc && OPAL_ERR_IN_PROCESS != rc) { - OBJ_RELEASE(opalcaddy); - } - if (OPAL_ERR_IN_PROCESS == rc) { - rc = OPAL_SUCCESS; - } - return ext2x_convert_opalrc(rc); -} - -static pmix_status_t server_publish_fn(const pmix_proc_t *p, - const pmix_info_t info[], size_t ninfo, - pmix_op_cbfunc_t cbfunc, void *cbdata) -{ - int rc; - size_t n; - ext2x_opalcaddy_t *opalcaddy; - opal_process_name_t proc; - opal_value_t *oinfo; - - if (NULL == host_module || NULL == host_module->publish) { - return PMIX_ERR_NOT_SUPPORTED; - } - - /* convert the nspace/rank to an opal_process_name_t */ - if (OPAL_SUCCESS != (rc = opal_convert_string_to_jobid(&proc.jobid, p->nspace))) { - return ext2x_convert_opalrc(rc); - } - proc.vpid = ext2x_convert_rank(p->rank); - - opal_output_verbose(3, opal_pmix_base_framework.framework_output, - "%s CLIENT %s CALLED PUBLISH", - OPAL_NAME_PRINT(OPAL_PROC_MY_NAME), - OPAL_NAME_PRINT(proc)); - - /* setup the caddy */ - opalcaddy = OBJ_NEW(ext2x_opalcaddy_t); - opalcaddy->opcbfunc = cbfunc; - opalcaddy->cbdata = cbdata; - - /* convert the info array */ - for (n=0; n < ninfo; n++) { - oinfo = OBJ_NEW(opal_value_t); - opal_list_append(&opalcaddy->info, &oinfo->super); - oinfo->key = strdup(info[n].key); - if (OPAL_SUCCESS != (rc = ext2x_value_unload(oinfo, &info[n].value))) { - OBJ_RELEASE(opalcaddy); - return ext2x_convert_opalrc(rc); - } - } - - /* pass it up */ - rc = host_module->publish(&proc, &opalcaddy->info, opal_opcbfunc, opalcaddy); - if (OPAL_SUCCESS != rc) { - OBJ_RELEASE(opalcaddy); - } - - return ext2x_convert_opalrc(rc); -} - -static void opal_lkupcbfunc(int status, - opal_list_t *data, - void *cbdata) -{ - ext2x_opalcaddy_t *opalcaddy = (ext2x_opalcaddy_t*)cbdata; - pmix_status_t rc; - pmix_pdata_t *d=NULL; - size_t nd=0, n; - opal_pmix_pdata_t *p; - - if (NULL != opalcaddy->lkupcbfunc) { - rc = ext2x_convert_opalrc(status); - /* convert any returned data */ - if (NULL != data) { - nd = opal_list_get_size(data); - PMIX_PDATA_CREATE(d, nd); - n=0; - OPAL_LIST_FOREACH(p, data, opal_pmix_pdata_t) { - /* convert the jobid */ - (void)opal_snprintf_jobid(d[n].proc.nspace, PMIX_MAX_NSLEN, p->proc.jobid); - d[n].proc.rank = ext2x_convert_opalrank(p->proc.vpid); - (void)strncpy(d[n].key, p->value.key, PMIX_MAX_KEYLEN); - ext2x_value_load(&d[n].value, &p->value); - } - } - opalcaddy->lkupcbfunc(rc, d, nd, opalcaddy->cbdata); - PMIX_PDATA_FREE(d, nd); - } - OBJ_RELEASE(opalcaddy); -} - -static pmix_status_t server_lookup_fn(const pmix_proc_t *p, char **keys, - const pmix_info_t info[], size_t ninfo, - pmix_lookup_cbfunc_t cbfunc, void *cbdata) -{ - int rc; - ext2x_opalcaddy_t *opalcaddy; - opal_process_name_t proc; - opal_value_t *iptr; - size_t n; - - if (NULL == host_module || NULL == host_module->lookup) { - return PMIX_ERR_NOT_SUPPORTED; - } - - /* convert the nspace/rank to an opal_process_name_t */ - if (OPAL_SUCCESS != (rc = opal_convert_string_to_jobid(&proc.jobid, p->nspace))) { - return ext2x_convert_opalrc(rc); - } - proc.vpid = ext2x_convert_rank(p->rank); - - opal_output_verbose(3, opal_pmix_base_framework.framework_output, - "%s CLIENT %s CALLED LOOKUP", - OPAL_NAME_PRINT(OPAL_PROC_MY_NAME), - OPAL_NAME_PRINT(proc)); - - /* setup the caddy */ - opalcaddy = OBJ_NEW(ext2x_opalcaddy_t); - opalcaddy->lkupcbfunc = cbfunc; - opalcaddy->cbdata = cbdata; - - /* convert the array of pmix_info_t to the list of info */ - for (n=0; n < ninfo; n++) { - iptr = OBJ_NEW(opal_value_t); - opal_list_append(&opalcaddy->info, &iptr->super); - iptr->key = strdup(info[n].key); - if (OPAL_SUCCESS != (rc = ext2x_value_unload(iptr, &info[n].value))) { - OBJ_RELEASE(opalcaddy); - return ext2x_convert_opalrc(rc); - } - } - - /* pass it up */ - rc = host_module->lookup(&proc, keys, &opalcaddy->info, opal_lkupcbfunc, opalcaddy); - if (OPAL_SUCCESS != rc) { - OBJ_RELEASE(opalcaddy); - } - - return ext2x_convert_opalrc(rc); -} - - -static pmix_status_t server_unpublish_fn(const pmix_proc_t *p, char **keys, - const pmix_info_t info[], size_t ninfo, - pmix_op_cbfunc_t cbfunc, void *cbdata) -{ - int rc; - ext2x_opalcaddy_t *opalcaddy; - opal_process_name_t proc; - opal_value_t *iptr; - size_t n; - - if (NULL == host_module || NULL == host_module->unpublish) { - return PMIX_SUCCESS; - } - - /* convert the nspace/rank to an opal_process_name_t */ - if (OPAL_SUCCESS != (rc = opal_convert_string_to_jobid(&proc.jobid, p->nspace))) { - return ext2x_convert_opalrc(rc); - } - proc.vpid = ext2x_convert_rank(p->rank); - - opal_output_verbose(3, opal_pmix_base_framework.framework_output, - "%s CLIENT %s CALLED UNPUBLISH", - OPAL_NAME_PRINT(OPAL_PROC_MY_NAME), - OPAL_NAME_PRINT(proc)); - - /* setup the caddy */ - opalcaddy = OBJ_NEW(ext2x_opalcaddy_t); - opalcaddy->opcbfunc = cbfunc; - opalcaddy->cbdata = cbdata; - - /* convert the array of pmix_info_t to the list of info */ - for (n=0; n < ninfo; n++) { - iptr = OBJ_NEW(opal_value_t); - opal_list_append(&opalcaddy->info, &iptr->super); - iptr->key = strdup(info[n].key); - if (OPAL_SUCCESS != (rc = ext2x_value_unload(iptr, &info[n].value))) { - OBJ_RELEASE(opalcaddy); - return ext2x_convert_opalrc(rc); - } - } - - /* pass it up */ - rc = host_module->unpublish(&proc, keys, &opalcaddy->info, opal_opcbfunc, opalcaddy); - if (OPAL_SUCCESS != rc) { - OBJ_RELEASE(opalcaddy); - } - - return ext2x_convert_opalrc(rc); -} - -static void opal_spncbfunc(int status, opal_jobid_t jobid, void *cbdata) -{ - ext2x_opalcaddy_t *opalcaddy = (ext2x_opalcaddy_t*)cbdata; - pmix_status_t rc; - char nspace[PMIX_MAX_NSLEN]; - - if (NULL != opalcaddy->spwncbfunc) { - rc = ext2x_convert_opalrc(status); - /* convert the jobid */ - (void)opal_snprintf_jobid(nspace, PMIX_MAX_NSLEN, jobid); - opalcaddy->spwncbfunc(rc, nspace, opalcaddy->cbdata); - } - OBJ_RELEASE(opalcaddy); -} - -static pmix_status_t server_spawn_fn(const pmix_proc_t *p, - const pmix_info_t job_info[], size_t ninfo, - const pmix_app_t apps[], size_t napps, - pmix_spawn_cbfunc_t cbfunc, void *cbdata) -{ - ext2x_opalcaddy_t *opalcaddy; - opal_process_name_t proc; - opal_pmix_app_t *app; - opal_value_t *oinfo; - size_t k, n; - int rc; - - if (NULL == host_module || NULL == host_module->spawn) { - return PMIX_ERR_NOT_SUPPORTED; - } - - /* convert the nspace/rank to an opal_process_name_t */ - if (OPAL_SUCCESS != (rc = opal_convert_string_to_jobid(&proc.jobid, p->nspace))) { - return ext2x_convert_opalrc(rc); - } - proc.vpid = ext2x_convert_rank(p->rank); - - /* setup the caddy */ - opalcaddy = OBJ_NEW(ext2x_opalcaddy_t); - opalcaddy->spwncbfunc = cbfunc; - opalcaddy->cbdata = cbdata; - - /* convert the job info */ - for (k=0; k < ninfo; k++) { - oinfo = OBJ_NEW(opal_value_t); - opal_list_append(&opalcaddy->info, &oinfo->super); - oinfo->key = strdup(job_info[k].key); - if (OPAL_SUCCESS != (rc = ext2x_value_unload(oinfo, &job_info[k].value))) { - OBJ_RELEASE(opalcaddy); - return ext2x_convert_opalrc(rc); - } - } - - /* convert the apps */ - for (n=0; n < napps; n++) { - app = OBJ_NEW(opal_pmix_app_t); - opal_list_append(&opalcaddy->apps, &app->super); - if (NULL != apps[n].cmd) { - app->cmd = strdup(apps[n].cmd); - } - if (NULL != apps[n].argv) { - app->argv = opal_argv_copy(apps[n].argv); - } - if (NULL != apps[n].env) { - app->env = opal_argv_copy(apps[n].env); - } - app->maxprocs = apps[n].maxprocs; - for (k=0; k < apps[n].ninfo; k++) { - oinfo = OBJ_NEW(opal_value_t); - opal_list_append(&app->info, &oinfo->super); - oinfo->key = strdup(apps[n].info[k].key); - if (OPAL_SUCCESS != (rc = ext2x_value_unload(oinfo, &apps[n].info[k].value))) { - OBJ_RELEASE(opalcaddy); - return ext2x_convert_opalrc(rc); - } - } - } - - /* pass it up */ - rc = host_module->spawn(&proc, &opalcaddy->info, &opalcaddy->apps, opal_spncbfunc, opalcaddy); - if (OPAL_SUCCESS != rc) { - OPAL_ERROR_LOG(rc); - OBJ_RELEASE(opalcaddy); - } - - return ext2x_convert_opalrc(rc); -} - - -static pmix_status_t server_connect_fn(const pmix_proc_t procs[], size_t nprocs, - const pmix_info_t info[], size_t ninfo, - pmix_op_cbfunc_t cbfunc, void *cbdata) -{ - int rc; - ext2x_opalcaddy_t *opalcaddy; - opal_namelist_t *nm; - size_t n; - opal_value_t *oinfo; - - if (NULL == host_module || NULL == host_module->connect) { - return PMIX_ERR_NOT_SUPPORTED; - } - - /* setup the caddy */ - opalcaddy = OBJ_NEW(ext2x_opalcaddy_t); - opalcaddy->opcbfunc = cbfunc; - opalcaddy->cbdata = cbdata; - - /* convert the array of pmix_proc_t to the list of procs */ - for (n=0; n < nprocs; n++) { - nm = OBJ_NEW(opal_namelist_t); - opal_list_append(&opalcaddy->procs, &nm->super); - if (OPAL_SUCCESS != (rc = opal_convert_string_to_jobid(&nm->name.jobid, procs[n].nspace))) { - OBJ_RELEASE(opalcaddy); - return ext2x_convert_opalrc(rc); - } - nm->name.vpid = ext2x_convert_rank(procs[n].rank); - } - - /* convert the info */ - for (n=0; n < ninfo; n++) { - oinfo = OBJ_NEW(opal_value_t); - opal_list_append(&opalcaddy->info, &oinfo->super); - oinfo->key = strdup(info[n].key); - if (OPAL_SUCCESS != (rc = ext2x_value_unload(oinfo, &info[n].value))) { - OBJ_RELEASE(opalcaddy); - return ext2x_convert_opalrc(rc); - } - } - - /* pass it up */ - rc = host_module->connect(&opalcaddy->procs, &opalcaddy->info, opal_opcbfunc, opalcaddy); - if (OPAL_SUCCESS != rc) { - OBJ_RELEASE(opalcaddy); - } - - return ext2x_convert_opalrc(rc); -} - - -static pmix_status_t server_disconnect_fn(const pmix_proc_t procs[], size_t nprocs, - const pmix_info_t info[], size_t ninfo, - pmix_op_cbfunc_t cbfunc, void *cbdata) -{ - int rc; - ext2x_opalcaddy_t *opalcaddy; - opal_namelist_t *nm; - size_t n; - opal_value_t *oinfo; - - if (NULL == host_module || NULL == host_module->disconnect) { - return PMIX_ERR_NOT_SUPPORTED; - } - - /* setup the caddy */ - opalcaddy = OBJ_NEW(ext2x_opalcaddy_t); - opalcaddy->opcbfunc = cbfunc; - opalcaddy->cbdata = cbdata; - - /* convert the array of pmix_proc_t to the list of procs */ - for (n=0; n < nprocs; n++) { - nm = OBJ_NEW(opal_namelist_t); - opal_list_append(&opalcaddy->procs, &nm->super); - if (OPAL_SUCCESS != (rc = opal_convert_string_to_jobid(&nm->name.jobid, procs[n].nspace))) { - OBJ_RELEASE(opalcaddy); - return ext2x_convert_opalrc(rc); - } - nm->name.vpid = ext2x_convert_rank(procs[n].rank); - } - - /* convert the info */ - for (n=0; n < ninfo; n++) { - oinfo = OBJ_NEW(opal_value_t); - opal_list_append(&opalcaddy->info, &oinfo->super); - oinfo->key = strdup(info[n].key); - if (OPAL_SUCCESS != (rc = ext2x_value_unload(oinfo, &info[n].value))) { - OBJ_RELEASE(opalcaddy); - return ext2x_convert_opalrc(rc); - } - } - - /* pass it up */ - rc = host_module->disconnect(&opalcaddy->procs, &opalcaddy->info, opal_opcbfunc, opalcaddy); - if (OPAL_SUCCESS != rc) { - OBJ_RELEASE(opalcaddy); - } - - return ext2x_convert_opalrc(rc); -} - -static pmix_status_t server_register_events(pmix_status_t *codes, size_t ncodes, - const pmix_info_t info[], size_t ninfo, - pmix_op_cbfunc_t cbfunc, void *cbdata) -{ - ext2x_opalcaddy_t *opalcaddy; - size_t n; - opal_value_t *oinfo; - int rc; - - opal_output_verbose(3, opal_pmix_base_framework.framework_output, - "%s REGISTER EVENTS", - OPAL_NAME_PRINT(OPAL_PROC_MY_NAME)); - - /* setup the caddy */ - opalcaddy = OBJ_NEW(ext2x_opalcaddy_t); - opalcaddy->opcbfunc = cbfunc; - opalcaddy->cbdata = cbdata; - - /* convert the info */ - for (n=0; n < ninfo; n++) { - oinfo = OBJ_NEW(opal_value_t); - opal_list_append(&opalcaddy->info, &oinfo->super); - oinfo->key = strdup(info[n].key); - if (OPAL_SUCCESS != (rc = ext2x_value_unload(oinfo, &info[n].value))) { - OBJ_RELEASE(opalcaddy); - return ext2x_convert_opalrc(rc); - } - } - - /* pass it up */ - rc = host_module->register_events(&opalcaddy->info, opal_opcbfunc, opalcaddy); - if (OPAL_SUCCESS != rc) { - OBJ_RELEASE(opalcaddy); - } - - return ext2x_convert_opalrc(rc); -} - -static pmix_status_t server_deregister_events(pmix_status_t *codes, size_t ncodes, - pmix_op_cbfunc_t cbfunc, void *cbdata) -{ - opal_output_verbose(3, opal_pmix_base_framework.framework_output, - "%s DEREGISTER EVENTS", OPAL_NAME_PRINT(OPAL_PROC_MY_NAME)); - - return PMIX_ERR_NOT_SUPPORTED; -} - -static pmix_status_t server_notify_event(pmix_status_t code, - const pmix_proc_t *source, - pmix_data_range_t range, - pmix_info_t info[], size_t ninfo, - pmix_op_cbfunc_t cbfunc, void *cbdata) -{ - ext2x_opalcaddy_t *opalcaddy; - opal_process_name_t src; - size_t n; - opal_value_t *oinfo; - int rc, status; - - if (NULL == host_module || NULL == host_module->notify_event) { - return PMIX_ERR_NOT_SUPPORTED; - } - - /* setup the caddy */ - opalcaddy = OBJ_NEW(ext2x_opalcaddy_t); - opalcaddy->opcbfunc = cbfunc; - opalcaddy->cbdata = cbdata; - - /* convert the code */ - status = ext2x_convert_rc(code); - - /* convert the source */ - if (OPAL_SUCCESS != (rc = opal_convert_string_to_jobid(&src.jobid, source->nspace))) { - OBJ_RELEASE(opalcaddy); - return ext2x_convert_opalrc(rc); - } - src.vpid = ext2x_convert_rank(source->rank); - - opal_output_verbose(3, opal_pmix_base_framework.framework_output, - "%s CLIENT %s CALLED NOTIFY", - OPAL_NAME_PRINT(OPAL_PROC_MY_NAME), - OPAL_NAME_PRINT(src)); - - /* ignore the range for now */ - - /* convert the info */ - for (n=0; n < ninfo; n++) { - oinfo = OBJ_NEW(opal_value_t); - opal_list_append(&opalcaddy->info, &oinfo->super); - oinfo->key = strdup(info[n].key); - if (OPAL_SUCCESS != (rc = ext2x_value_unload(oinfo, &info[n].value))) { - OBJ_RELEASE(opalcaddy); - return ext2x_convert_opalrc(rc); - } - } - - /* send it upstairs */ - if (OPAL_SUCCESS != (rc = host_module->notify_event(status, &src, &opalcaddy->info, - opal_opcbfunc, opalcaddy))) { - OBJ_RELEASE(opalcaddy); - } - return ext2x_convert_opalrc(rc); -} - -static void _info_rel(void *cbdata) -{ - ext2x_opcaddy_t *pcaddy = (ext2x_opcaddy_t*)cbdata; - - OBJ_RELEASE(pcaddy); -} -static void info_cbfunc(int status, - opal_list_t *info, - void *cbdata, - opal_pmix_release_cbfunc_t release_fn, - void *release_cbdata) -{ - ext2x_opalcaddy_t *opalcaddy = (ext2x_opalcaddy_t*)cbdata; - ext2x_opcaddy_t *pcaddy; - opal_value_t *kv; - size_t n; - - pcaddy = OBJ_NEW(ext2x_opcaddy_t); - - /* convert the status */ - pcaddy->status = ext2x_convert_opalrc(status); - - /* convert the list to a pmix_info_t array */ - if (NULL != info) { - pcaddy->ninfo = opal_list_get_size(info); - if (0 < pcaddy->ninfo) { - PMIX_INFO_CREATE(pcaddy->info, pcaddy->ninfo); - n = 0; - OPAL_LIST_FOREACH(kv, info, opal_value_t) { - (void)strncpy(pcaddy->info[n].key, kv->key, PMIX_MAX_KEYLEN); - ext2x_value_load(&pcaddy->info[n].value, kv); - } - } - } - /* we are done with the incoming data */ - if (NULL != release_fn) { - release_fn(release_cbdata); - } - - /* provide the answer downward */ - if (NULL != opalcaddy->infocbfunc) { - opalcaddy->infocbfunc(pcaddy->status, pcaddy->info, pcaddy->ninfo, - opalcaddy->cbdata, _info_rel, pcaddy); - } - OBJ_RELEASE(opalcaddy); -} - -static pmix_status_t server_query(pmix_proc_t *proct, - pmix_query_t *queries, size_t nqueries, - pmix_info_cbfunc_t cbfunc, - void *cbdata) -{ - ext2x_opalcaddy_t *opalcaddy; - opal_process_name_t requestor; - int rc; - size_t n, m; - opal_pmix_query_t *q; - opal_value_t *oinfo; - - if (NULL == host_module || NULL == host_module->query) { - return PMIX_ERR_NOT_SUPPORTED; - } - - /* setup the caddy */ - opalcaddy = OBJ_NEW(ext2x_opalcaddy_t); - opalcaddy->infocbfunc = cbfunc; - opalcaddy->cbdata = cbdata; - - /* convert the requestor */ - if (OPAL_SUCCESS != (rc = opal_convert_string_to_jobid(&requestor.jobid, proct->nspace))) { - OBJ_RELEASE(opalcaddy); - return ext2x_convert_opalrc(rc); - } - requestor.vpid = ext2x_convert_rank(proct->rank); - - opal_output_verbose(3, opal_pmix_base_framework.framework_output, - "%s CLIENT %s CALLED QUERY", - OPAL_NAME_PRINT(OPAL_PROC_MY_NAME), - OPAL_NAME_PRINT(requestor)); - - /* convert the queries */ - for (n=0; n < nqueries; n++) { - q = OBJ_NEW(opal_pmix_query_t); - /* we "borrow" the info field of the caddy as we and the - * server function both agree on what will be there */ - opal_list_append(&opalcaddy->info, &q->super); - q->keys = opal_argv_copy(queries[n].keys); - for (m=0; m < queries[n].nqual; m++) { - oinfo = OBJ_NEW(opal_value_t); - opal_list_append(&q->qualifiers, &oinfo->super); - oinfo->key = strdup(queries[n].qualifiers[m].key); - if (OPAL_SUCCESS != (rc = ext2x_value_unload(oinfo, &queries[n].qualifiers[m].value))) { - OBJ_RELEASE(opalcaddy); - return ext2x_convert_opalrc(rc); - } - } - } - - /* pass the call upwards */ - if (OPAL_SUCCESS != (rc = host_module->query(&requestor, - &opalcaddy->info, - info_cbfunc, opalcaddy))) { - OBJ_RELEASE(opalcaddy); - } - - return ext2x_convert_opalrc(rc); -} - -static void toolcbfunc(int status, - opal_process_name_t proc, - void *cbdata) -{ - ext2x_opalcaddy_t *opalcaddy = (ext2x_opalcaddy_t*)cbdata; - pmix_status_t rc; - pmix_proc_t p; - opal_ext2x_jobid_trkr_t *job; - - /* convert the status */ - rc = ext2x_convert_opalrc(status); - - memset(&p, 0, sizeof(pmix_proc_t)); - if (OPAL_SUCCESS == status) { - /* convert the process name */ - (void)opal_snprintf_jobid(p.nspace, PMIX_MAX_NSLEN, proc.jobid); - p.rank = ext2x_convert_opalrank(proc.vpid); - /* store this job in our list of known nspaces */ - job = OBJ_NEW(opal_ext2x_jobid_trkr_t); - (void)strncpy(job->nspace, p.nspace, PMIX_MAX_NSLEN); - job->jobid = proc.jobid; - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - opal_list_append(&mca_pmix_ext2x_component.jobids, &job->super); - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - } - - /* pass it down */ - if (NULL != opalcaddy->toolcbfunc) { - opalcaddy->toolcbfunc(rc, &p, opalcaddy->cbdata); - } - OBJ_RELEASE(opalcaddy); -} - -static void server_tool_connection(pmix_info_t *info, size_t ninfo, - pmix_tool_connection_cbfunc_t cbfunc, - void *cbdata) -{ - ext2x_opalcaddy_t *opalcaddy; - size_t n; - opal_value_t *oinfo; - int rc; - pmix_status_t err; - - /* setup the caddy */ - opalcaddy = OBJ_NEW(ext2x_opalcaddy_t); - opalcaddy->toolcbfunc = cbfunc; - opalcaddy->cbdata = cbdata; - - /* convert the info */ - for (n=0; n < ninfo; n++) { - oinfo = OBJ_NEW(opal_value_t); - opal_list_append(&opalcaddy->info, &oinfo->super); - oinfo->key = strdup(info[n].key); - if (OPAL_SUCCESS != (rc = ext2x_value_unload(oinfo, &info[n].value))) { - OBJ_RELEASE(opalcaddy); - err = ext2x_convert_opalrc(rc); - if (NULL != cbfunc) { - cbfunc(err, NULL, cbdata); - } - } - } - - /* pass it up */ - host_module->tool_connected(&opalcaddy->info, toolcbfunc, opalcaddy); -} - -static void server_log(const pmix_proc_t *proct, - const pmix_info_t data[], size_t ndata, - const pmix_info_t directives[], size_t ndirs, - pmix_op_cbfunc_t cbfunc, void *cbdata) -{ - ext2x_opalcaddy_t *opalcaddy; - opal_process_name_t requestor; - int rc; - size_t n; - opal_value_t *oinfo; - pmix_status_t ret; - - if (NULL == host_module || NULL == host_module->log) { - if (NULL != cbfunc) { - cbfunc(PMIX_ERR_NOT_SUPPORTED, cbdata); - } - return; - } - - /* setup the caddy */ - opalcaddy = OBJ_NEW(ext2x_opalcaddy_t); - opalcaddy->opcbfunc = cbfunc; - opalcaddy->cbdata = cbdata; - - /* convert the requestor */ - if (OPAL_SUCCESS != (rc = opal_convert_string_to_jobid(&requestor.jobid, proct->nspace))) { - OBJ_RELEASE(opalcaddy); - ret = ext2x_convert_opalrc(rc); - if (NULL != cbfunc) { - cbfunc(ret, cbdata); - } - return; - } - requestor.vpid = ext2x_convert_rank(proct->rank); - - /* convert the data */ - for (n=0; n < ndata; n++) { - oinfo = OBJ_NEW(opal_value_t); - oinfo->key = strdup(data[n].key); - /* we "borrow" the info field of the caddy as we and the - * server function both agree on what will be there */ - opal_list_append(&opalcaddy->info, &oinfo->super); - if (OPAL_SUCCESS != (rc = ext2x_value_unload(oinfo, &data[n].value))) { - OBJ_RELEASE(opalcaddy); - ret = ext2x_convert_opalrc(rc); - if (NULL != cbfunc) { - cbfunc(ret, cbdata); - } - return; - } - } - - /* convert the directives */ - for (n=0; n < ndirs; n++) { - oinfo = OBJ_NEW(opal_value_t); - /* we "borrow" the apps field of the caddy as we and the - * server function both agree on what will be there */ - opal_list_append(&opalcaddy->apps, &oinfo->super); - if (OPAL_SUCCESS != (rc = ext2x_value_unload(oinfo, &directives[n].value))) { - OBJ_RELEASE(opalcaddy); - ret = ext2x_convert_opalrc(rc); - if (NULL != cbfunc) { - cbfunc(ret, cbdata); - } - return; - } - } - - /* pass the call upwards */ - host_module->log(&requestor, - &opalcaddy->info, - &opalcaddy->apps, - opal_opcbfunc, opalcaddy); -} - -static pmix_status_t server_allocate(const pmix_proc_t *proct, - pmix_alloc_directive_t directive, - const pmix_info_t data[], size_t ndata, - pmix_info_cbfunc_t cbfunc, void *cbdata) -{ - ext2x_opalcaddy_t *opalcaddy; - opal_process_name_t requestor; - int rc; - size_t n; - opal_value_t *oinfo; - opal_pmix_alloc_directive_t odir; - - if (NULL == host_module || NULL == host_module->allocate) { - return PMIX_ERR_NOT_SUPPORTED; - } - - /* setup the caddy */ - opalcaddy = OBJ_NEW(ext2x_opalcaddy_t); - opalcaddy->infocbfunc = cbfunc; - opalcaddy->cbdata = cbdata; - - /* convert the requestor */ - if (OPAL_SUCCESS != (rc = opal_convert_string_to_jobid(&requestor.jobid, proct->nspace))) { - OBJ_RELEASE(opalcaddy); - return ext2x_convert_opalrc(rc); - } - requestor.vpid = ext2x_convert_rank(proct->rank); - - /* convert the directive */ - odir = ext2x_convert_allocdir(directive); - - /* convert the data */ - for (n=0; n < ndata; n++) { - oinfo = OBJ_NEW(opal_value_t); - opal_list_append(&opalcaddy->info, &oinfo->super); - if (OPAL_SUCCESS != (rc = ext2x_value_unload(oinfo, &data[n].value))) { - OBJ_RELEASE(opalcaddy); - return ext2x_convert_opalrc(rc); - } - } - - /* pass the call upwards */ - if (OPAL_SUCCESS != (rc = host_module->allocate(&requestor, odir, - &opalcaddy->info, - info_cbfunc, opalcaddy))) { - OBJ_RELEASE(opalcaddy); - return ext2x_convert_opalrc(rc); - } - - return PMIX_SUCCESS; - -} - -static pmix_status_t server_job_control(const pmix_proc_t *proct, - const pmix_proc_t targets[], size_t ntargets, - const pmix_info_t directives[], size_t ndirs, - pmix_info_cbfunc_t cbfunc, void *cbdata) -{ - ext2x_opalcaddy_t *opalcaddy; - opal_process_name_t requestor; - int rc; - size_t n; - opal_value_t *oinfo; - opal_namelist_t *nm; - - if (NULL == host_module || NULL == host_module->job_control) { - return PMIX_ERR_NOT_SUPPORTED; - } - - /* setup the caddy */ - opalcaddy = OBJ_NEW(ext2x_opalcaddy_t); - opalcaddy->infocbfunc = cbfunc; - opalcaddy->cbdata = cbdata; - - /* convert the requestor */ - if (OPAL_SUCCESS != (rc = opal_convert_string_to_jobid(&requestor.jobid, proct->nspace))) { - OBJ_RELEASE(opalcaddy); - return ext2x_convert_opalrc(rc); - } - requestor.vpid = ext2x_convert_rank(proct->rank); - - /* convert the targets */ - for (n=0; n < ntargets; n++) { - nm = OBJ_NEW(opal_namelist_t); - opal_list_append(&opalcaddy->procs, &nm->super); - if (OPAL_SUCCESS != (rc = opal_convert_string_to_jobid(&nm->name.jobid, targets[n].nspace))) { - OBJ_RELEASE(opalcaddy); - return ext2x_convert_opalrc(rc); - } - nm->name.vpid = ext2x_convert_rank(targets[n].rank); - } - - /* convert the directives */ - for (n=0; n < ndirs; n++) { - oinfo = OBJ_NEW(opal_value_t); - opal_list_append(&opalcaddy->info, &oinfo->super); - if (OPAL_SUCCESS != (rc = ext2x_value_unload(oinfo, &directives[n].value))) { - OBJ_RELEASE(opalcaddy); - return ext2x_convert_opalrc(rc); - } - } - - /* pass the call upwards */ - if (OPAL_SUCCESS != (rc = host_module->job_control(&requestor, - &opalcaddy->procs, - &opalcaddy->info, - info_cbfunc, opalcaddy))) { - OBJ_RELEASE(opalcaddy); - return ext2x_convert_opalrc(rc); - } - - return PMIX_SUCCESS; -} diff --git a/opal/mca/pmix/ext2x/pmix2x_server_south.c b/opal/mca/pmix/ext2x/pmix2x_server_south.c deleted file mode 100644 index 2b84e9c379..0000000000 --- a/opal/mca/pmix/ext2x/pmix2x_server_south.c +++ /dev/null @@ -1,556 +0,0 @@ -/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */ -/* - * Copyright (c) 2014-2017 Intel, Inc. All rights reserved. - * Copyright (c) 2014-2017 Research Organization for Information Science - * and Technology (RIST). All rights reserved. - * Copyright (c) 2014-2016 Intel, Inc. All rights reserved. - * Copyright (c) 2014-2017 Mellanox Technologies, Inc. - * All rights reserved. - * Copyright (c) 2016 Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2017 Los Alamos National Security, LLC. All rights - * reserved. - * $COPYRIGHT$ - * - * Additional copyrights may follow - * - * $HEADER$ - */ - -#include "opal_config.h" -#include "opal/constants.h" -#include "opal/types.h" - -#ifdef HAVE_STRING_H -#include -#endif -#ifdef HAVE_UNISTD_H -#include -#endif - -#include "opal/dss/dss.h" -#include "opal/mca/event/event.h" -#include "opal/mca/hwloc/base/base.h" -#include "opal/runtime/opal.h" -#include "opal/runtime/opal_progress_threads.h" -#include "opal/threads/threads.h" -#include "opal/util/argv.h" -#include "opal/util/error.h" -#include "opal/util/output.h" -#include "opal/util/opal_environ.h" -#include "opal/util/proc.h" -#include "opal/util/show_help.h" -#include "opal/mca/pmix/base/base.h" -#include "pmix2x.h" - -#include "pmix.h" -#include "pmix_server.h" - -/**** S.O.U.T.H.B.O.U.N.D I.N.T.E.R.F.A.C.E.S ****/ - -/* These are the interfaces used by the OMPI/ORTE/OPAL layer to call - * down into the embedded PMIx server. */ - -extern pmix_server_module_t mymodule; -extern opal_pmix_server_module_t *host_module; -static char *dbgvalue=NULL; - -static void errreg_cbfunc (pmix_status_t status, - size_t errhandler_ref, - void *cbdata) -{ - opal_ext2x_event_t *ev = (opal_ext2x_event_t*)cbdata; - - OPAL_ACQUIRE_OBJECT(ev); - ev->index = errhandler_ref; - opal_output_verbose(5, opal_pmix_base_framework.framework_output, - "PMIX server errreg_cbfunc - error handler registered status=%d, reference=%lu", - status, (unsigned long)errhandler_ref); - OPAL_POST_OBJECT(ev); - OPAL_PMIX_WAKEUP_THREAD(&ev->lock); -} - -static void opcbfunc(pmix_status_t status, void *cbdata) -{ - ext2x_opcaddy_t *op = (ext2x_opcaddy_t*)cbdata; - - OPAL_ACQUIRE_OBJECT(op); - - if (NULL != op->opcbfunc) { - op->opcbfunc(ext2x_convert_rc(status), op->cbdata); - } - OBJ_RELEASE(op); -} - -static void lkcbfunc(pmix_status_t status, void *cbdata) -{ - opal_pmix_lock_t *lk = (opal_pmix_lock_t*)cbdata; - - OPAL_POST_OBJECT(lk); - OPAL_PMIX_WAKEUP_THREAD(lk); -} - -int ext2x_server_init(opal_pmix_server_module_t *module, - opal_list_t *info) -{ - pmix_status_t rc; - int dbg; - opal_value_t *kv; - pmix_info_t *pinfo; - size_t sz, n; - opal_ext2x_event_t *event; - opal_ext2x_jobid_trkr_t *job; - opal_pmix_lock_t lk; - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - - if (0 == opal_pmix_base.initialized) { - if (0 < (dbg = opal_output_get_verbosity(opal_pmix_base_framework.framework_output))) { - asprintf(&dbgvalue, "PMIX_DEBUG=%d", dbg); - putenv(dbgvalue); - } - } - ++opal_pmix_base.initialized; - - /* convert the list to an array of pmix_info_t */ - if (NULL != info) { - sz = opal_list_get_size(info) + 2; - PMIX_INFO_CREATE(pinfo, sz); - n = 0; - OPAL_LIST_FOREACH(kv, info, opal_value_t) { - (void)strncpy(pinfo[n].key, kv->key, PMIX_MAX_KEYLEN); - ext2x_value_load(&pinfo[n].value, kv); - ++n; - } - } else { - sz = 2; - PMIX_INFO_CREATE(pinfo, 2); - } - - /* insert ourselves into our list of jobids - it will be the - * first, and so we'll check it first */ - job = OBJ_NEW(opal_ext2x_jobid_trkr_t); - (void)opal_snprintf_jobid(job->nspace, PMIX_MAX_NSLEN, OPAL_PROC_MY_NAME.jobid); - job->jobid = OPAL_PROC_MY_NAME.jobid; - opal_list_append(&mca_pmix_ext2x_component.jobids, &job->super); - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - /* add our nspace and rank to the array going down to the PMIx server */ - PMIX_INFO_LOAD(&pinfo[sz-2], PMIX_SERVER_NSPACE, job->nspace, PMIX_STRING); - PMIX_INFO_LOAD(&pinfo[sz-1], PMIX_SERVER_RANK, &OPAL_PROC_MY_NAME.vpid, PMIX_PROC_RANK); - if (PMIX_SUCCESS != (rc = PMIx_server_init(&mymodule, pinfo, sz))) { - PMIX_INFO_FREE(pinfo, sz); - return ext2x_convert_rc(rc); - } - PMIX_INFO_FREE(pinfo, sz); - - /* record the host module */ - host_module = module; - - /* register the default event handler */ - event = OBJ_NEW(opal_ext2x_event_t); - opal_list_append(&mca_pmix_ext2x_component.events, &event->super); - PMIX_INFO_CREATE(pinfo, 1); - PMIX_INFO_LOAD(&pinfo[0], PMIX_EVENT_HDLR_NAME, "OPAL-PMIX-2X-SERVER-DEFAULT", PMIX_STRING); - PMIx_Register_event_handler(NULL, 0, pinfo, 1, ext2x_event_hdlr, errreg_cbfunc, (void*)event); - OPAL_PMIX_WAIT_THREAD(&event->lock); - PMIX_INFO_FREE(pinfo, 1); - - /* as we might want to use some client-side functions, be sure - * to register our own nspace */ - OPAL_PMIX_CONSTRUCT_LOCK(&lk); - PMIX_INFO_CREATE(pinfo, 1); - PMIX_INFO_LOAD(&pinfo[0], PMIX_REGISTER_NODATA, NULL, PMIX_BOOL); - PMIx_server_register_nspace(job->nspace, 1, pinfo, 1, lkcbfunc, (void*)&lk); - OPAL_PMIX_WAIT_THREAD(&lk); - OPAL_PMIX_DESTRUCT_LOCK(&lk); - PMIX_INFO_FREE(pinfo, 1); - - return OPAL_SUCCESS; -} - -static void dereg_cbfunc(pmix_status_t st, void *cbdata) -{ - opal_ext2x_event_t *ev = (opal_ext2x_event_t*)cbdata; - OPAL_PMIX_WAKEUP_THREAD(&ev->lock); -} - -int ext2x_server_finalize(void) -{ - pmix_status_t rc; - opal_ext2x_event_t *event, *ev2; - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - --opal_pmix_base.initialized; - - if (0 < opal_pmix_base.initialized) { - /* deregister all event handlers */ - OPAL_LIST_FOREACH_SAFE(event, ev2, &mca_pmix_ext2x_component.events, opal_ext2x_event_t) { - OPAL_PMIX_DESTRUCT_LOCK(&event->lock); - OPAL_PMIX_CONSTRUCT_LOCK(&event->lock); - PMIx_Deregister_event_handler(event->index, dereg_cbfunc, (void*)event); - OPAL_PMIX_WAIT_THREAD(&event->lock); - opal_list_remove_item(&mca_pmix_ext2x_component.events, &event->super); - OBJ_RELEASE(event); - } - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - rc = PMIx_server_finalize(); - return ext2x_convert_rc(rc); -} - -int ext2x_server_gen_regex(const char *input, char **regex) -{ - pmix_status_t rc; - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - if (0 >= opal_pmix_base.initialized) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_INITIALIZED; - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - rc = PMIx_generate_regex(input, regex); - return ext2x_convert_rc(rc); -} - - -int ext2x_server_gen_ppn(const char *input, char **ppn) -{ - pmix_status_t rc; - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - if (0 >= opal_pmix_base.initialized) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_INITIALIZED; - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - rc = PMIx_generate_ppn(input, ppn); - return ext2x_convert_rc(rc); -} - -int ext2x_server_register_nspace(opal_jobid_t jobid, - int nlocalprocs, - opal_list_t *info, - opal_pmix_op_cbfunc_t cbfunc, - void *cbdata) -{ - opal_value_t *kv, *k2; - pmix_info_t *pinfo = NULL, *pmap; - size_t sz, szmap, m, n; - char nspace[PMIX_MAX_NSLEN]; - pmix_status_t rc; - opal_list_t *pmapinfo; - opal_ext2x_jobid_trkr_t *job; - opal_pmix_lock_t lock; - int ret; - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - if (0 >= opal_pmix_base.initialized) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_INITIALIZED; - } - - /* convert the jobid */ - (void)opal_snprintf_jobid(nspace, PMIX_MAX_NSLEN, jobid); - - /* store this job in our list of known nspaces */ - job = OBJ_NEW(opal_ext2x_jobid_trkr_t); - (void)strncpy(job->nspace, nspace, PMIX_MAX_NSLEN); - job->jobid = jobid; - opal_list_append(&mca_pmix_ext2x_component.jobids, &job->super); - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - /* convert the list to an array of pmix_info_t */ - if (NULL != info) { - sz = opal_list_get_size(info); - PMIX_INFO_CREATE(pinfo, sz); - n = 0; - OPAL_LIST_FOREACH(kv, info, opal_value_t) { - (void)strncpy(pinfo[n].key, kv->key, PMIX_MAX_KEYLEN); - if (0 == strcmp(kv->key, OPAL_PMIX_PROC_DATA)) { - pinfo[n].value.type = PMIX_DATA_ARRAY; - /* the value contains a list of values - convert - * that list to another array */ - pmapinfo = (opal_list_t*)kv->data.ptr; - szmap = opal_list_get_size(pmapinfo); - PMIX_INFO_CREATE(pmap, szmap); - pinfo[n].value.data.darray = (pmix_data_array_t*)calloc(1, sizeof(pmix_data_array_t)); - pinfo[n].value.data.darray->type = PMIX_INFO; - pinfo[n].value.data.darray->array = (struct pmix_info_t*)pmap; - pinfo[n].value.data.darray->size = szmap; - m = 0; - OPAL_LIST_FOREACH(k2, pmapinfo, opal_value_t) { - (void)strncpy(pmap[m].key, k2->key, PMIX_MAX_KEYLEN); - ext2x_value_load(&pmap[m].value, k2); - ++m; - } - OPAL_LIST_RELEASE(pmapinfo); - } else { - ext2x_value_load(&pinfo[n].value, kv); - } - ++n; - } - } else { - sz = 0; - pinfo = NULL; - } - - OPAL_PMIX_CONSTRUCT_LOCK(&lock); - rc = PMIx_server_register_nspace(nspace, nlocalprocs, pinfo, sz, - lkcbfunc, (void*)&lock); - if (PMIX_SUCCESS == rc) { - OPAL_PMIX_WAIT_THREAD(&lock); - } - OPAL_PMIX_DESTRUCT_LOCK(&lock); - - if (NULL != pinfo) { - PMIX_INFO_FREE(pinfo, sz); - } - - ret = ext2x_convert_rc(rc); - - /* release the caller */ - if (NULL != cbfunc) { - cbfunc(ret, cbdata); - } - return ret; -} - -void ext2x_server_deregister_nspace(opal_jobid_t jobid, - opal_pmix_op_cbfunc_t cbfunc, - void *cbdata) -{ - opal_ext2x_jobid_trkr_t *jptr; - opal_pmix_lock_t lock; - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - if (0 >= opal_pmix_base.initialized) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - /* release the caller */ - if (NULL != cbfunc) { - cbfunc(OPAL_ERR_NOT_INITIALIZED, cbdata); - } - return; - } - - /* if we don't already have it, we can ignore this */ - OPAL_LIST_FOREACH(jptr, &mca_pmix_ext2x_component.jobids, opal_ext2x_jobid_trkr_t) { - if (jptr->jobid == jobid) { - /* found it - tell the server to deregister */ - OPAL_PMIX_CONSTRUCT_LOCK(&lock); - PMIx_server_deregister_nspace(jptr->nspace, lkcbfunc, (void*)&lock); - OPAL_PMIX_WAIT_THREAD(&lock); - OPAL_PMIX_DESTRUCT_LOCK(&lock); - /* now get rid of it from our list */ - opal_list_remove_item(&mca_pmix_ext2x_component.jobids, &jptr->super); - OBJ_RELEASE(jptr); - break; - } - } - - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - /* release the caller */ - if (NULL != cbfunc) { - cbfunc(OPAL_SUCCESS, cbdata); - } -} - -int ext2x_server_register_client(const opal_process_name_t *proc, - uid_t uid, gid_t gid, - void *server_object, - opal_pmix_op_cbfunc_t cbfunc, - void *cbdata) -{ - pmix_status_t rc; - pmix_proc_t p; - opal_pmix_lock_t lock; - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - if (0 >= opal_pmix_base.initialized) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_INITIALIZED; - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - /* convert the jobid */ - (void)opal_snprintf_jobid(p.nspace, PMIX_MAX_NSLEN, proc->jobid); - p.rank = ext2x_convert_opalrank(proc->vpid); - - OPAL_PMIX_CONSTRUCT_LOCK(&lock); - rc = PMIx_server_register_client(&p, uid, gid, server_object, - lkcbfunc, (void*)&lock); - if (PMIX_SUCCESS == rc) { - OPAL_PMIX_WAIT_THREAD(&lock); - } - OPAL_PMIX_DESTRUCT_LOCK(&lock); - return ext2x_convert_rc(rc); -} - -/* tell the local PMIx server to cleanup this client as it is - * done executing */ -void ext2x_server_deregister_client(const opal_process_name_t *proc, - opal_pmix_op_cbfunc_t cbfunc, - void *cbdata) -{ - opal_ext2x_jobid_trkr_t *jptr; - pmix_proc_t p; - opal_pmix_lock_t lock; - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - if (0 >= opal_pmix_base.initialized) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - if (NULL != cbfunc) { - cbfunc(OPAL_ERR_NOT_INITIALIZED, cbdata); - } - return; - } - - /* if we don't already have it, we can ignore this */ - OPAL_LIST_FOREACH(jptr, &mca_pmix_ext2x_component.jobids, opal_ext2x_jobid_trkr_t) { - if (jptr->jobid == proc->jobid) { - /* found it - tell the server to deregister */ - (void)strncpy(p.nspace, jptr->nspace, PMIX_MAX_NSLEN); - p.rank = ext2x_convert_opalrank(proc->vpid); - OPAL_PMIX_CONSTRUCT_LOCK(&lock); - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - PMIx_server_deregister_client(&p, lkcbfunc, (void*)&lock); - OPAL_PMIX_WAIT_THREAD(&lock); - OPAL_PMIX_DESTRUCT_LOCK(&lock); - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - break; - } - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - if (NULL != cbfunc) { - cbfunc(OPAL_SUCCESS, cbdata); - } -} - -/* have the local PMIx server setup the environment for this client */ -int ext2x_server_setup_fork(const opal_process_name_t *proc, char ***env) -{ - pmix_status_t rc; - pmix_proc_t p; - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - if (0 >= opal_pmix_base.initialized) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_INITIALIZED; - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - /* convert the jobid */ - (void)opal_snprintf_jobid(p.nspace, PMIX_MAX_NSLEN, proc->jobid); - p.rank = ext2x_convert_opalrank(proc->vpid); - - rc = PMIx_server_setup_fork(&p, env); - return ext2x_convert_rc(rc); -} - -/* this is the call back up from the embedded PMIx server that - * will contain the returned data. Note that the embedded server - * "owns" the data and will free it upon return from this function */ -static void dmdx_response(pmix_status_t status, char *data, size_t sz, void *cbdata) -{ - int rc; - ext2x_opcaddy_t *op = (ext2x_opcaddy_t*)cbdata; - - rc = ext2x_convert_rc(status); - if (NULL != op->mdxcbfunc) { - op->mdxcbfunc(rc, data, sz, op->cbdata, NULL, NULL); - } - OBJ_RELEASE(op); -} - -/* request modex data for a local proc from the PMIx server */ -int ext2x_server_dmodex(const opal_process_name_t *proc, - opal_pmix_modex_cbfunc_t cbfunc, void *cbdata) -{ - ext2x_opcaddy_t *op; - pmix_status_t rc; - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - if (0 >= opal_pmix_base.initialized) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_INITIALIZED; - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - /* setup the caddy */ - op = OBJ_NEW(ext2x_opcaddy_t); - op->mdxcbfunc = cbfunc; - op->cbdata = cbdata; - - /* convert the jobid */ - (void)opal_snprintf_jobid(op->p.nspace, PMIX_MAX_NSLEN, proc->jobid); - op->p.rank = ext2x_convert_opalrank(proc->vpid); - - /* find the internally-cached data for this proc */ - rc = PMIx_server_dmodex_request(&op->p, dmdx_response, op); - if (PMIX_SUCCESS != rc) { - OBJ_RELEASE(op); - } - return ext2x_convert_rc(rc); -} - -/* tell the PMIx server to notify its local clients of an event */ -int ext2x_server_notify_event(int status, - const opal_process_name_t *source, - opal_list_t *info, - opal_pmix_op_cbfunc_t cbfunc, void *cbdata) -{ - opal_value_t *kv; - pmix_info_t *pinfo; - size_t sz, n; - pmix_status_t rc; - ext2x_opcaddy_t *op; - - OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock); - if (0 >= opal_pmix_base.initialized) { - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - return OPAL_ERR_NOT_INITIALIZED; - } - OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); - - /* convert the list to an array of pmix_info_t */ - if (NULL != info) { - sz = opal_list_get_size(info); - PMIX_INFO_CREATE(pinfo, sz); - n = 0; - OPAL_LIST_FOREACH(kv, info, opal_value_t) { - (void)strncpy(pinfo[n].key, kv->key, PMIX_MAX_KEYLEN); - ext2x_value_load(&pinfo[n].value, kv); - ++n; - } - } else { - sz = 0; - pinfo = NULL; - } - /* setup the caddy */ - op = OBJ_NEW(ext2x_opcaddy_t); - op->info = pinfo; - op->sz = sz; - op->opcbfunc = cbfunc; - op->cbdata = cbdata; - /* convert the jobid */ - if (NULL == source) { - (void)opal_snprintf_jobid(op->p.nspace, PMIX_MAX_NSLEN, OPAL_JOBID_INVALID); - op->p.rank = ext2x_convert_opalrank(OPAL_VPID_INVALID); - } else { - (void)opal_snprintf_jobid(op->p.nspace, PMIX_MAX_NSLEN, source->jobid); - op->p.rank = ext2x_convert_opalrank(source->vpid); - } - - - rc = ext2x_convert_opalrc(status); - /* the range must be nonlocal so the server will pass - * the event down to its local clients */ - rc = PMIx_Notify_event(rc, &op->p, PMIX_RANGE_SESSION, - pinfo, sz, opcbfunc, op); - if (PMIX_SUCCESS != rc) { - OBJ_RELEASE(op); - } - return ext2x_convert_rc(rc); -} diff --git a/opal/mca/pmix/pmix2x/Makefile.am b/opal/mca/pmix/pmix2x/Makefile.am index 061b751b94..6546b2a822 100644 --- a/opal/mca/pmix/pmix2x/Makefile.am +++ b/opal/mca/pmix/pmix2x/Makefile.am @@ -22,6 +22,7 @@ sources = \ pmix2x_component.c \ pmix2x.c \ pmix2x_client.c \ + pmix2x_local.c \ pmix2x_server_south.c \ pmix2x_server_north.c diff --git a/opal/mca/pmix/pmix2x/pmix2x.c b/opal/mca/pmix/pmix2x/pmix2x.c index 33e55806e3..4a3a58fca0 100644 --- a/opal/mca/pmix/pmix2x/pmix2x.c +++ b/opal/mca/pmix/pmix2x/pmix2x.c @@ -194,17 +194,14 @@ static void return_local_event_hdlr(int status, opal_list_t *results, if (NULL != cd->pmixcbfunc) { op = OBJ_NEW(pmix2x_opcaddy_t); - if (NULL != results) { - /* convert the list of results to an array of info */ - op->ninfo = opal_list_get_size(results); - if (0 < op->ninfo) { - PMIX_INFO_CREATE(op->info, op->ninfo); - n=0; - OPAL_LIST_FOREACH(kv, cd->info, opal_value_t) { - (void)strncpy(op->info[n].key, kv->key, PMIX_MAX_KEYLEN); - pmix2x_value_load(&op->info[n].value, kv); - ++n; - } + if (NULL != results && 0 < (op->ninfo = opal_list_get_size(results))) { + /* convert the list of results to an array of info */ + PMIX_INFO_CREATE(op->info, op->ninfo); + n=0; + OPAL_LIST_FOREACH(kv, cd->info, opal_value_t) { + (void)strncpy(op->info[n].key, kv->key, PMIX_MAX_KEYLEN); + pmix2x_value_load(&op->info[n].value, kv); + ++n; } } /* convert the status */ @@ -815,13 +812,17 @@ void pmix2x_value_load(pmix_value_t *v, v->data.darray = (pmix_data_array_t*)malloc(sizeof(pmix_data_array_t)); v->data.darray->type = PMIX_INFO; v->data.darray->size = opal_list_get_size(list); - PMIX_INFO_CREATE(info, v->data.darray->size); - v->data.darray->array = info; - n=0; - OPAL_LIST_FOREACH(val, list, opal_value_t) { - (void)strncpy(info[n].key, val->key, PMIX_MAX_KEYLEN); - pmix2x_value_load(&info[n].value, val); - ++n; + if (0 < v->data.darray->size) { + PMIX_INFO_CREATE(info, v->data.darray->size); + v->data.darray->array = info; + n=0; + OPAL_LIST_FOREACH(val, list, opal_value_t) { + (void)strncpy(info[n].key, val->key, PMIX_MAX_KEYLEN); + pmix2x_value_load(&info[n].value, val); + ++n; + } + } else { + v->data.darray->array = NULL; } break; default: @@ -1066,16 +1067,13 @@ static void register_handler(opal_list_t *event_codes, } /* convert the list of info to an array of pmix_info_t */ - if (NULL != info) { - op->ninfo = opal_list_get_size(info); - if (0 < op->ninfo) { - PMIX_INFO_CREATE(op->info, op->ninfo); - n=0; - OPAL_LIST_FOREACH(kv, info, opal_value_t) { - (void)strncpy(op->info[n].key, kv->key, PMIX_MAX_KEYLEN); - pmix2x_value_load(&op->info[n].value, kv); - ++n; - } + if (NULL != info && 0 < (op->ninfo = opal_list_get_size(info))) { + PMIX_INFO_CREATE(op->info, op->ninfo); + n=0; + OPAL_LIST_FOREACH(kv, info, opal_value_t) { + (void)strncpy(op->info[n].key, kv->key, PMIX_MAX_KEYLEN); + pmix2x_value_load(&op->info[n].value, kv); + ++n; } } @@ -1180,16 +1178,13 @@ static int notify_event(int status, prange = pmix2x_convert_opalrange(range); /* convert the list of info */ - if (NULL != info) { - op->ninfo = opal_list_get_size(info); - if (0 < op->ninfo) { - PMIX_INFO_CREATE(op->info, op->ninfo); - n=0; - OPAL_LIST_FOREACH(kv, info, opal_value_t) { - (void)strncpy(op->info[n].key, kv->key, PMIX_MAX_KEYLEN); - pmix2x_value_load(&op->info[n].value, kv); - ++n; - } + if (NULL != info && 0 < (op->ninfo = opal_list_get_size(info))) { + PMIX_INFO_CREATE(op->info, op->ninfo); + n=0; + OPAL_LIST_FOREACH(kv, info, opal_value_t) { + (void)strncpy(op->info[n].key, kv->key, PMIX_MAX_KEYLEN); + pmix2x_value_load(&op->info[n].value, kv); + ++n; } } @@ -1392,113 +1387,6 @@ opal_pmix_alloc_directive_t pmix2x_convert_allocdir(pmix_alloc_directive_t dir) } } -typedef struct { - opal_list_item_t super; - char *opalname; - char *opalvalue; - char *pmixname; - char *pmixvalue; - bool mismatched; -} opal_pmix_evar_t; -static void econ(opal_pmix_evar_t *p) -{ - p->opalname = NULL; - p->opalvalue = NULL; - p->pmixname = NULL; - p->pmixvalue = NULL; - p->mismatched = false; -} -static OBJ_CLASS_INSTANCE(opal_pmix_evar_t, - opal_list_item_t, - econ, NULL); -struct known_value { - char *opalname; - char *pmixname; -}; - -static struct known_value known_values[] = { - {"OPAL_PREFIX", "PMIX_INSTALL_PREFIX"}, - {"OPAL_EXEC_PREFIX", "PMIX_EXEC_PREFIX"}, - {"OPAL_BINDIR", "PMIX_BINDIR"}, - {"OPAL_SBINDIR", "PMIX_SBINDIR"}, - {"OPAL_LIBEXECDIR", "PMIX_LIBEXECDIR"}, - {"OPAL_DATAROOTDIR", "PMIX_DATAROOTDIR"}, - {"OPAL_DATADIR", "PMIX_DATADIR"}, - {"OPAL_SYSCONFDIR", "PMIX_SYSCONFDIR"}, - {"OPAL_SHAREDSTATEDIR", "PMIX_SHAREDSTATEDIR"}, - {"OPAL_LOCALSTATEDIR", "PMIX_LOCALSTATEDIR"}, - {"OPAL_LIBDIR", "PMIX_LIBDIR"}, - {"OPAL_INCLUDEDIR", "PMIX_INCLUDEDIR"}, - {"OPAL_INFODIR", "PMIX_INFODIR"}, - {"OPAL_MANDIR", "PMIX_MANDIR"}, - {"OPAL_PKGDATADIR", "PMIX_PKGDATADIR"}, - {"OPAL_PKGLIBDIR", "PMIX_PKGLIBDIR"}, - {"OPAL_PKGINCLUDEDIR", "PMIX_PKGINCLUDEDIR"} -}; - - -int opal_pmix_pmix2x_check_evars(void) -{ - opal_list_t values; - int nvals, i; - opal_pmix_evar_t *evar; - bool mismatched = false; - char *tmp=NULL, *tmp2; - - OBJ_CONSTRUCT(&values, opal_list_t); - nvals = sizeof(known_values) / sizeof(struct known_value); - for (i=0; i < nvals; i++) { - evar = OBJ_NEW(opal_pmix_evar_t); - evar->opalname = known_values[i].opalname; - evar->opalvalue = getenv(evar->opalname); - evar->pmixname = known_values[i].pmixname; - evar->pmixvalue = getenv(evar->pmixname); - /* if the OPAL value is not set and the PMIx value is, - * then that is a problem. Likewise, if both are set - * and are different, then that is also a problem. Note that - * it is okay for the OPAL value to be set and the PMIx - * value to not be set */ - if ((NULL == evar->opalvalue && NULL != evar->pmixvalue) || - (NULL != evar->opalvalue && NULL != evar->pmixvalue && - 0 != strcmp(evar->opalvalue, evar->pmixvalue))) { - evar->mismatched = true; - mismatched = true; - } - opal_list_append(&values, &evar->super); - } - if (!mismatched) { - /* transfer any OPAL values that were set - we already verified - * that the equivalent PMIx value, if present, matches, so - * don't overwrite it */ - OPAL_LIST_FOREACH(evar, &values, opal_pmix_evar_t) { - if (NULL != evar->opalvalue && NULL == evar->pmixvalue) { - opal_setenv(evar->pmixname, evar->opalvalue, true, &environ); - } - } - OPAL_LIST_DESTRUCT(&values); - return OPAL_SUCCESS; - } - /* we have at least one mismatch somewhere, so print out the table */ - OPAL_LIST_FOREACH(evar, &values, opal_pmix_evar_t) { - if (evar->mismatched) { - if (NULL == tmp) { - asprintf(&tmp, " %s: %s\n %s: %s", - evar->opalname, (NULL == evar->opalvalue) ? "NULL" : evar->opalvalue, - evar->pmixname, (NULL == evar->pmixvalue) ? "NULL" : evar->pmixvalue); - } else { - asprintf(&tmp2, "%s\n\n %s: %s\n %s: %s", tmp, - evar->opalname, (NULL == evar->opalvalue) ? "NULL" : evar->opalvalue, - evar->pmixname, (NULL == evar->pmixvalue) ? "NULL" : evar->pmixvalue); - free(tmp); - tmp = tmp2; - } - } - } - opal_show_help("help-pmix-pmix2x.txt", "evars", true, tmp); - free(tmp); - return OPAL_ERR_SILENT; -} - /**** INSTANTIATE INTERNAL CLASSES ****/ OBJ_CLASS_INSTANCE(opal_pmix2x_jobid_trkr_t, opal_list_item_t, diff --git a/opal/mca/pmix/pmix2x/pmix2x_local.c b/opal/mca/pmix/pmix2x/pmix2x_local.c new file mode 100644 index 0000000000..e279f8f112 --- /dev/null +++ b/opal/mca/pmix/pmix2x/pmix2x_local.c @@ -0,0 +1,155 @@ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */ +/* + * Copyright (c) 2014-2017 Intel, Inc. All rights reserved. + * Copyright (c) 2014-2017 Research Organization for Information Science + * and Technology (RIST). All rights reserved. + * Copyright (c) 2014-2015 Mellanox Technologies, Inc. + * All rights reserved. + * Copyright (c) 2016 Cisco Systems, Inc. All rights reserved. + * Copyright (c) 2017 Los Alamos National Security, LLC. All rights + * reserved. + * $COPYRIGHT$ + * + * Additional copyrights may follow + * + * $HEADER$ + */ + +#include "opal_config.h" +#include "opal/constants.h" +#include "opal/types.h" + +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif + +#include "opal/dss/dss.h" +#include "opal/mca/event/event.h" +#include "opal/mca/hwloc/base/base.h" +#include "opal/runtime/opal.h" +#include "opal/runtime/opal_progress_threads.h" +#include "opal/threads/threads.h" +#include "opal/util/argv.h" +#include "opal/util/error.h" +#include "opal/util/opal_environ.h" +#include "opal/util/output.h" +#include "opal/util/proc.h" +#include "opal/util/show_help.h" + +#include "pmix2x.h" +#include "opal/mca/pmix/base/base.h" +#include "opal/mca/pmix/pmix_types.h" + +#include +#include + + +typedef struct { + opal_list_item_t super; + char *opalname; + char *opalvalue; + char *pmixname; + char *pmixvalue; + bool mismatched; +} opal_pmix_evar_t; +static void econ(opal_pmix_evar_t *p) +{ + p->opalname = NULL; + p->opalvalue = NULL; + p->pmixname = NULL; + p->pmixvalue = NULL; + p->mismatched = false; +} +static OBJ_CLASS_INSTANCE(opal_pmix_evar_t, + opal_list_item_t, + econ, NULL); +struct known_value { + char *opalname; + char *pmixname; +}; + +static struct known_value known_values[] = { + {"OPAL_PREFIX", "PMIX_INSTALL_PREFIX"}, + {"OPAL_EXEC_PREFIX", "PMIX_EXEC_PREFIX"}, + {"OPAL_BINDIR", "PMIX_BINDIR"}, + {"OPAL_SBINDIR", "PMIX_SBINDIR"}, + {"OPAL_LIBEXECDIR", "PMIX_LIBEXECDIR"}, + {"OPAL_DATAROOTDIR", "PMIX_DATAROOTDIR"}, + {"OPAL_DATADIR", "PMIX_DATADIR"}, + {"OPAL_SYSCONFDIR", "PMIX_SYSCONFDIR"}, + {"OPAL_SHAREDSTATEDIR", "PMIX_SHAREDSTATEDIR"}, + {"OPAL_LOCALSTATEDIR", "PMIX_LOCALSTATEDIR"}, + {"OPAL_LIBDIR", "PMIX_LIBDIR"}, + {"OPAL_INCLUDEDIR", "PMIX_INCLUDEDIR"}, + {"OPAL_INFODIR", "PMIX_INFODIR"}, + {"OPAL_MANDIR", "PMIX_MANDIR"}, + {"OPAL_PKGDATADIR", "PMIX_PKGDATADIR"}, + {"OPAL_PKGLIBDIR", "PMIX_PKGLIBDIR"}, + {"OPAL_PKGINCLUDEDIR", "PMIX_PKGINCLUDEDIR"} +}; + + +int opal_pmix_pmix2x_check_evars(void) +{ + opal_list_t values; + int nvals, i; + opal_pmix_evar_t *evar; + bool mismatched = false; + char *tmp=NULL, *tmp2; + + OBJ_CONSTRUCT(&values, opal_list_t); + nvals = sizeof(known_values) / sizeof(struct known_value); + for (i=0; i < nvals; i++) { + evar = OBJ_NEW(opal_pmix_evar_t); + evar->opalname = known_values[i].opalname; + evar->opalvalue = getenv(evar->opalname); + evar->pmixname = known_values[i].pmixname; + evar->pmixvalue = getenv(evar->pmixname); + /* if the OPAL value is not set and the PMIx value is, + * then that is a problem. Likewise, if both are set + * and are different, then that is also a problem. Note that + * it is okay for the OPAL value to be set and the PMIx + * value to not be set */ + if ((NULL == evar->opalvalue && NULL != evar->pmixvalue) || + (NULL != evar->opalvalue && NULL != evar->pmixvalue && + 0 != strcmp(evar->opalvalue, evar->pmixvalue))) { + evar->mismatched = true; + mismatched = true; + } + opal_list_append(&values, &evar->super); + } + if (!mismatched) { + /* transfer any OPAL values that were set - we already verified + * that the equivalent PMIx value, if present, matches, so + * don't overwrite it */ + OPAL_LIST_FOREACH(evar, &values, opal_pmix_evar_t) { + if (NULL != evar->opalvalue && NULL == evar->pmixvalue) { + opal_setenv(evar->pmixname, evar->opalvalue, true, &environ); + } + } + OPAL_LIST_DESTRUCT(&values); + return OPAL_SUCCESS; + } + /* we have at least one mismatch somewhere, so print out the table */ + OPAL_LIST_FOREACH(evar, &values, opal_pmix_evar_t) { + if (evar->mismatched) { + if (NULL == tmp) { + asprintf(&tmp, " %s: %s\n %s: %s", + evar->opalname, (NULL == evar->opalvalue) ? "NULL" : evar->opalvalue, + evar->pmixname, (NULL == evar->pmixvalue) ? "NULL" : evar->pmixvalue); + } else { + asprintf(&tmp2, "%s\n\n %s: %s\n %s: %s", tmp, + evar->opalname, (NULL == evar->opalvalue) ? "NULL" : evar->opalvalue, + evar->pmixname, (NULL == evar->pmixvalue) ? "NULL" : evar->pmixvalue); + free(tmp); + tmp = tmp2; + } + } + } + opal_show_help("help-pmix-pmix2x.txt", "evars", true, tmp); + free(tmp); + return OPAL_ERR_SILENT; +} diff --git a/opal/mca/pmix/pmix2x/pmix2x_server_north.c b/opal/mca/pmix/pmix2x/pmix2x_server_north.c index e867105626..4801fddb74 100644 --- a/opal/mca/pmix/pmix2x/pmix2x_server_north.c +++ b/opal/mca/pmix/pmix2x/pmix2x_server_north.c @@ -921,15 +921,12 @@ static void info_cbfunc(int status, pcaddy->status = pmix2x_convert_opalrc(status); /* convert the list to a pmix_info_t array */ - if (NULL != info) { - pcaddy->ninfo = opal_list_get_size(info); - if (0 < pcaddy->ninfo) { - PMIX_INFO_CREATE(pcaddy->info, pcaddy->ninfo); - n = 0; - OPAL_LIST_FOREACH(kv, info, opal_value_t) { - (void)strncpy(pcaddy->info[n].key, kv->key, PMIX_MAX_KEYLEN); - pmix2x_value_load(&pcaddy->info[n].value, kv); - } + if (NULL != info && 0 < (pcaddy->ninfo = opal_list_get_size(info))) { + PMIX_INFO_CREATE(pcaddy->info, pcaddy->ninfo); + n = 0; + OPAL_LIST_FOREACH(kv, info, opal_value_t) { + (void)strncpy(pcaddy->info[n].key, kv->key, PMIX_MAX_KEYLEN); + pmix2x_value_load(&pcaddy->info[n].value, kv); } } /* we are done with the incoming data */ diff --git a/opal/mca/pmix/pmix2x/pmix2x_server_south.c b/opal/mca/pmix/pmix2x/pmix2x_server_south.c index 187d61f8d3..6ec1f259f6 100644 --- a/opal/mca/pmix/pmix2x/pmix2x_server_south.c +++ b/opal/mca/pmix/pmix2x/pmix2x_server_south.c @@ -117,18 +117,15 @@ int pmix2x_server_init(opal_pmix_server_module_t *module, ++opal_pmix_base.initialized; /* convert the list to an array of pmix_info_t */ + sz = 2 + ((NULL==info)?0:opal_list_get_size(info)); + PMIX_INFO_CREATE(pinfo, sz); + n = 0; if (NULL != info) { - sz = opal_list_get_size(info) + 2; - PMIX_INFO_CREATE(pinfo, sz); - n = 0; OPAL_LIST_FOREACH(kv, info, opal_value_t) { (void)strncpy(pinfo[n].key, kv->key, PMIX_MAX_KEYLEN); pmix2x_value_load(&pinfo[n].value, kv); ++n; } - } else { - sz = 2; - PMIX_INFO_CREATE(pinfo, 2); } /* insert ourselves into our list of jobids - it will be the @@ -268,8 +265,7 @@ int pmix2x_server_register_nspace(opal_jobid_t jobid, OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); /* convert the list to an array of pmix_info_t */ - if (NULL != info) { - sz = opal_list_get_size(info); + if (NULL != info && 0 < (sz = opal_list_get_size(info))) { PMIX_INFO_CREATE(pinfo, sz); n = 0; OPAL_LIST_FOREACH(kv, info, opal_value_t) { @@ -280,16 +276,18 @@ int pmix2x_server_register_nspace(opal_jobid_t jobid, * that list to another array */ pmapinfo = (opal_list_t*)kv->data.ptr; szmap = opal_list_get_size(pmapinfo); - PMIX_INFO_CREATE(pmap, szmap); - pinfo[n].value.data.darray = (pmix_data_array_t*)calloc(1, sizeof(pmix_data_array_t)); - pinfo[n].value.data.darray->type = PMIX_INFO; - pinfo[n].value.data.darray->array = (struct pmix_info_t*)pmap; - pinfo[n].value.data.darray->size = szmap; - m = 0; - OPAL_LIST_FOREACH(k2, pmapinfo, opal_value_t) { - (void)strncpy(pmap[m].key, k2->key, PMIX_MAX_KEYLEN); - pmix2x_value_load(&pmap[m].value, k2); - ++m; + if (0 < szmap) { + PMIX_INFO_CREATE(pmap, szmap); + pinfo[n].value.data.darray = (pmix_data_array_t*)calloc(1, sizeof(pmix_data_array_t)); + pinfo[n].value.data.darray->type = PMIX_INFO; + pinfo[n].value.data.darray->array = (struct pmix_info_t*)pmap; + pinfo[n].value.data.darray->size = szmap; + m = 0; + OPAL_LIST_FOREACH(k2, pmapinfo, opal_value_t) { + (void)strncpy(pmap[m].key, k2->key, PMIX_MAX_KEYLEN); + pmix2x_value_load(&pmap[m].value, k2); + ++m; + } } OPAL_LIST_RELEASE(pmapinfo); } else { @@ -520,8 +518,7 @@ int pmix2x_server_notify_event(int status, OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock); /* convert the list to an array of pmix_info_t */ - if (NULL != info) { - sz = opal_list_get_size(info); + if (NULL != info && 0 < (sz = opal_list_get_size(info))) { PMIX_INFO_CREATE(pinfo, sz); n = 0; OPAL_LIST_FOREACH(kv, info, opal_value_t) {