static void found_channel(const char *app, const char *version, const char *release, orcm_pnp_channel_t channel) { opal_output(0, "%s recvd channel %d for triplet %s:%s:%s", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), channel, app, version, release); ORCM_CREATE_STRING_ID(&string_id, app, version, release); peer = channel; }
static void responses(orcm_info_t *vm) { if (ORTE_JOBID_INVALID != target.jobid) { return; } if (0 == strcasecmp(vm->app, "client") && 0 == strcasecmp(vm->version, "1.0")) { opal_output(0, "%s ASSIGNING %s TO TARGET", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), ORTE_NAME_PRINT(vm->name)); target.jobid = vm->name->jobid; target.vpid = vm->name->vpid; ORCM_CREATE_STRING_ID(&string_id, vm->app, vm->version, vm->release); } }
static int cancel_receive(const char *app, const char *version, const char *release, orcm_pnp_channel_t channel, orcm_pnp_tag_t tag) { orcm_pnp_channel_obj_t *chan; orcm_pnp_request_t *req; orcm_triplet_t *triplet; orcm_triplet_group_t *grp; opal_list_item_t *item, *next; char *string_id; int ret=ORCM_SUCCESS; int i; OPAL_OUTPUT_VERBOSE((2, orcm_pnp_base.output, "%s pnp:default:cancel_recv app %s version %s release %s channel %s tag %s", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), (NULL == app) ? "NULL" : app, (NULL == version) ? "NULL" : version, (NULL == release) ? "NULL" : release, orcm_pnp_print_channel(channel), orcm_pnp_print_tag(tag))); /* since we are modifying global lists, lock * the thread */ ORTE_ACQUIRE_THREAD(&local_thread); /* if this is the wildcard channel, loop across all channels */ if (ORCM_PNP_WILDCARD_CHANNEL == channel) { /* get the string id for this triplet */ ORCM_CREATE_STRING_ID(&string_id, app, version, release); for (i=0; i < orcm_pnp_base.channels.size; i++) { if (NULL == (chan = (orcm_pnp_channel_obj_t*)opal_pointer_array_get_item(&orcm_pnp_base.channels, i))) { continue; } item = opal_list_get_first(&chan->recvs); while (item != opal_list_get_end(&chan->recvs)) { next = opal_list_get_next(item); req = (orcm_pnp_request_t*)item; if (0 == strcasecmp(string_id, ORCM_WILDCARD_STRING_ID) || 0 == strcasecmp(string_id, req->string_id)) { if (ORCM_PNP_TAG_WILDCARD == tag || tag == req->tag) { opal_list_remove_item(&chan->recvs, item); OBJ_RELEASE(item); } } item = next; } } goto cleanup; } /* are we looking at the group input channel? */ if (ORCM_PNP_GROUP_INPUT_CHANNEL == channel) { triplet = orcm_get_triplet(app, version, release, false); if (NULL != triplet) { /* remove the triplet-stored recvs */ item = opal_list_get_first(&triplet->input_recvs); while (item != opal_list_get_end(&triplet->input_recvs)) { next = opal_list_get_next(item); req = (orcm_pnp_request_t*)item; if (ORCM_PNP_TAG_WILDCARD == tag || tag == req->tag) { opal_list_remove_item(&triplet->input_recvs, item); OBJ_RELEASE(item); } item = next; } for (i=0; i < triplet->groups.size; i++) { if (NULL == (grp = (orcm_triplet_group_t*)opal_pointer_array_get_item(&triplet->groups, i))) { continue; } if (ORCM_PNP_INVALID_CHANNEL != grp->input) { /* just look thru the default group input channel */ chan = (orcm_pnp_channel_obj_t*)opal_pointer_array_get_item(&orcm_pnp_base.channels, grp->input); if (NULL == chan) { /* nothing to do */ ORTE_RELEASE_THREAD(&triplet->ctl); goto cleanup; } item = opal_list_get_first(&chan->recvs); while (item != opal_list_get_end(&chan->recvs)) { next = opal_list_get_next(item); req = (orcm_pnp_request_t*)item; if (ORCM_PNP_TAG_WILDCARD == tag || tag == req->tag) { opal_list_remove_item(&chan->recvs, item); OBJ_RELEASE(item); } item = next; } } } /* release the triplet */ ORTE_RELEASE_THREAD(&triplet->ctl); } goto cleanup; } /* are we looking at the group output channel? */ if (ORCM_PNP_GROUP_OUTPUT_CHANNEL == channel) { triplet = orcm_get_triplet(app, version, release, false); if (NULL != triplet) { /* remove the triplet-stored recvs */ item = opal_list_get_first(&triplet->output_recvs); while (item != opal_list_get_end(&triplet->output_recvs)) { next = opal_list_get_next(item); req = (orcm_pnp_request_t*)item; if (ORCM_PNP_TAG_WILDCARD == tag || tag == req->tag) { opal_list_remove_item(&triplet->output_recvs, item); OBJ_RELEASE(item); } item = next; } for (i=0; i < triplet->groups.size; i++) { if (NULL == (grp = (orcm_triplet_group_t*)opal_pointer_array_get_item(&triplet->groups, i))) { continue; } if (ORCM_PNP_INVALID_CHANNEL != grp->output) { /* just look thru the default group output channel */ chan = (orcm_pnp_channel_obj_t*)opal_pointer_array_get_item(&orcm_pnp_base.channels, grp->output); if (NULL == chan) { /* nothing to do */ ORTE_RELEASE_THREAD(&triplet->ctl); goto cleanup; } item = opal_list_get_first(&chan->recvs); while (item != opal_list_get_end(&chan->recvs)) { next = opal_list_get_next(item); req = (orcm_pnp_request_t*)item; if (ORCM_PNP_TAG_WILDCARD == tag || tag == req->tag) { opal_list_remove_item(&chan->recvs, item); OBJ_RELEASE(item); } item = next; } } } /* release the triplet */ ORTE_RELEASE_THREAD(&triplet->ctl); } goto cleanup; } /* if this isn't either input or output channel, then get the channel object */ if (NULL != (chan = (orcm_pnp_channel_obj_t*)opal_pointer_array_get_item(&orcm_pnp_base.channels, channel))) { ORCM_CREATE_STRING_ID(&string_id, app, version, release); item = opal_list_get_first(&chan->recvs); while (item != opal_list_get_end(&chan->recvs)) { next = opal_list_get_next(item); req = (orcm_pnp_request_t*)item; if (0 == strcasecmp(string_id, req->string_id)) { if (ORCM_PNP_TAG_WILDCARD == tag || tag == req->tag) { opal_list_remove_item(&chan->recvs, item); OBJ_RELEASE(item); } } item = next; } free(string_id); } cleanup: /* clear the thread */ ORTE_RELEASE_THREAD(&local_thread); return ret; }
static int announce(const char *app, const char *version, const char *release, orcm_pnp_announce_fn_t cbfunc) { int ret; opal_buffer_t buf; orcm_pnp_channel_t chan; /* bozo check */ if (NULL == app || NULL == version || NULL == release) { ORTE_ERROR_LOG(ORCM_ERR_BAD_PARAM); return ORCM_ERR_BAD_PARAM; } if (!orcm_pnp_base.comm_enabled) { return ORCM_ERR_COMM_DISABLED; } /* protect against threading */ ORTE_ACQUIRE_THREAD(&local_thread); if (NULL != orcm_pnp_base.my_string_id) { /* must have been called before */ OPAL_OUTPUT_VERBOSE((2, orcm_pnp_base.output, "%s pnp:default:announce called before", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME))); ORTE_RELEASE_THREAD(&local_thread); return ORCM_SUCCESS; } OPAL_OUTPUT_VERBOSE((2, orcm_pnp_base.output, "%s pnp:default:announce app %s version %s release %s", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), app, version, release)); /* retain a local record of my info - this enables communication * by setting my_string_id != NULL */ ORCM_CREATE_STRING_ID(&orcm_pnp_base.my_string_id, app, version, release); /* retain the callback function */ orcm_pnp_base.my_announce_cbfunc = cbfunc; /* get a triplet object for myself - creates * it if one doesn't already exist */ orcm_pnp_base.my_triplet = orcm_get_triplet(app, version, release, true); /* get my group object */ orcm_pnp_base.my_group = orcm_get_triplet_group(orcm_pnp_base.my_triplet, ORTE_PROC_MY_NAME->jobid, true); orcm_pnp_base.my_group->uid = orcm_pnp_base.my_uid; orcm_pnp_base.my_group->input = orcm_pnp_base.my_input_channel->channel; orcm_pnp_base.my_group->output = orcm_pnp_base.my_output_channel->channel; /* check for pending recvs for these channels - this will copy * recvs that were pre-posted on the triplet to the channel * array */ orcm_pnp_base_check_pending_recvs(orcm_pnp_base.my_triplet, orcm_pnp_base.my_group); /* release the triplet as we no longer require it */ ORTE_RELEASE_THREAD(&orcm_pnp_base.my_triplet->ctl); /* no need to hold the lock any further */ ORTE_RELEASE_THREAD(&local_thread); /* assemble the announcement message */ OBJ_CONSTRUCT(&buf, opal_buffer_t); /* pack the common elements */ if (ORCM_SUCCESS != (ret = orcm_pnp_base_pack_announcement(&buf, ORTE_NAME_INVALID))) { ORTE_ERROR_LOG(ret); OBJ_DESTRUCT(&buf); return ret; } /* select the channel */ if (ORCM_PROC_IS_APP) { chan = ORTE_RMCAST_APP_PUBLIC_CHANNEL; } else { chan = ORTE_RMCAST_SYS_CHANNEL; } /* send it */ if (ORCM_SUCCESS != (ret = default_output(chan, NULL, ORCM_PNP_TAG_ANNOUNCE, NULL, 0, &buf))) { ORTE_ERROR_LOG(ret); } /* cleanup */ OBJ_DESTRUCT(&buf); return ret; }