#include "src/include/pmix_config.h"
#include "src/client/pmix_client_ops.h"
#include "src/include/pmix_globals.h"
#include "src/mca/bfrops/bfrops.h"
#include "src/mca/ptl/ptl.h"
#include "src/util/pmix_error.h"
#include "src/util/pmix_name_fns.h"
#include "pmix_tool_ops.h"
static void tool_switchyard(struct pmix_peer_t *pr,
pmix_ptl_hdr_t *hdr,
pmix_buffer_t *buf,
void *cbdata);
pmix_status_t pmix_tool_relay_op(pmix_cmd_t cmd, pmix_peer_t *peer,
pmix_buffer_t *bfr, uint32_t tag)
{
pmix_shift_caddy_t *s;
pmix_status_t rc;
pmix_buffer_t *relay;
pmix_cmd_t relaycmds[] = {PMIX_SPAWNNB_CMD};
bool found = false;
size_t nrelaycmds, n;
nrelaycmds = sizeof(relaycmds) / sizeof(pmix_cmd_t);
for (n = 0; n < nrelaycmds; n++) {
if (cmd == relaycmds[n]) {
found = true;
break;
}
}
if (!found) {
return PMIX_ERR_NOT_SUPPORTED;
}
if (!pmix_globals.connected) {
return PMIX_ERR_UNREACH;
}
s = PMIX_NEW(pmix_shift_caddy_t);
PMIX_RETAIN(peer);
s->peer = peer;
s->ncodes = tag;
bfr->unpack_ptr = bfr->base_ptr;
relay = PMIX_NEW(pmix_buffer_t);
PMIX_BFROPS_COPY_PAYLOAD(rc, peer, relay, bfr);
if (PMIX_SUCCESS != rc) {
PMIX_RELEASE(relay);
PMIX_RELEASE(s);
return rc;
}
PMIX_PTL_SEND_RECV(rc, pmix_client_globals.myserver, relay, tool_switchyard, (void *) s);
if (PMIX_SUCCESS != rc) {
PMIX_RELEASE(relay);
PMIX_RELEASE(s);
return rc;
}
return PMIX_SUCCESS;
}
static void tool_switchyard(struct pmix_peer_t *pr, pmix_ptl_hdr_t *hdr,
pmix_buffer_t *buf, void *cbdata)
{
pmix_shift_caddy_t *s = (pmix_shift_caddy_t *) cbdata;
pmix_buffer_t *relay;
pmix_status_t rc;
uint32_t tag = (uint32_t) s->ncodes;
PMIX_HIDE_UNUSED_PARAMS(pr, hdr);
relay = PMIX_NEW(pmix_buffer_t);
PMIX_BFROPS_COPY_PAYLOAD(rc, pmix_globals.mypeer, relay, buf);
if (PMIX_SUCCESS != rc) {
PMIX_ERROR_LOG(rc);
PMIX_RELEASE(relay);
return;
}
PMIX_SERVER_QUEUE_REPLY(rc, s->peer, tag, relay);
if (PMIX_SUCCESS != rc) {
PMIX_ERROR_LOG(rc);
PMIX_RELEASE(relay);
}
PMIX_RELEASE(s);
}