int pmi_simple_client_init (struct pmi_simple_client *pmi, int *spawned) { int result = PMI_FAIL; unsigned int vers, subvers; char buf[SIMPLE_MAX_PROTO_LINE]; int rc; if (dprintf (pmi->fd, "cmd=init pmi_version=1 pmi_subversion=1\n") < 0) goto done; if (dgetline (pmi->fd, buf, sizeof (buf)) < 0) goto done; if (keyval_parse_isword (buf, "cmd", "response_to_init") < 0) goto done; if (keyval_parse_int (buf, "rc", &rc) == 0 && rc != 0) { result = rc; goto done; } if (keyval_parse_uint (buf, "pmi_version", &vers) < 0 || keyval_parse_uint (buf, "pmi_subversion", &subvers) < 0) goto done; if (vers != 1 || subvers != 1) goto done; if (dprintf (pmi->fd, "cmd=get_maxes\n") < 0) goto done; if (dgetline (pmi->fd, buf, sizeof (buf)) < 0) goto done; if (keyval_parse_isword (buf, "cmd", "maxes") < 0) goto done; if (keyval_parse_int (buf, "rc", &rc) == 0 && rc != 0) { result = rc; goto done; } if (keyval_parse_uint (buf, "kvsname_max", &pmi->kvsname_max) < 0 || keyval_parse_uint (buf, "keylen_max", &pmi->keylen_max) < 0 || keyval_parse_uint (buf, "vallen_max", &pmi->vallen_max) < 0) goto done; pmi->buflen = pmi->keylen_max + pmi->vallen_max + pmi->kvsname_max + SIMPLE_MAX_PROTO_OVERHEAD; if (!(pmi->buf = calloc (1, pmi->buflen))) { result = PMI_ERR_NOMEM; goto done; } pmi->initialized = 1; if (spawned) *spawned = pmi->spawned; result = PMI_SUCCESS; done: return result; }
int pmi_simple_client_kvs_get (struct pmi_simple_client *pmi, const char *kvsname, const char *key, char *value, int len) { int result = PMI_FAIL; int rc; if (!pmi->initialized) goto done; if (dprintf (pmi->fd, "cmd=get kvsname=%s key=%s\n", kvsname, key) < 0) goto done; if (dgetline (pmi->fd, pmi->buf, sizeof (pmi->buf)) < 0) goto done; if (keyval_parse_isword (pmi->buf, "cmd", "get_result") < 0) goto done; if (keyval_parse_int (pmi->buf, "rc", &rc) == 0 && rc != 0) { result = rc; goto done; } if (keyval_parse_string (pmi->buf, "value", value, len) < 0) goto done; result = PMI_SUCCESS; done: return result; }
static void s_io_cb (flux_reactor_t *r, flux_watcher_t *w, int revents, void *arg) { struct context *ctx = arg; int *rfd, fd = flux_fd_watcher_get_fd (w); char *resp; int rc; if (dgetline (fd, ctx->buf, ctx->buflen) < 0) { diag ("dgetline: %s", strerror (errno)); flux_reactor_stop_error (r); return; } rc = pmi_simple_server_request (ctx->pmi, ctx->buf, &ctx->fds[1]); if (rc < 0) { diag ("pmi_simple_server_request: %s", strerror (errno)); flux_reactor_stop_error (r); return; } while (pmi_simple_server_response (ctx->pmi, &resp, &rfd) == 0) { if (dputline (*rfd, resp) < 0) { diag ("dputline: %s", strerror (errno)); flux_reactor_stop_error (r); return; } free (resp); } if (rc == 1) { close (fd); flux_watcher_stop (w); } }
int pmi_simple_client_init (struct pmi_simple_client *pmi, int *spawned) { int result = PMI_FAIL; unsigned int vers, subvers; int rc; if (dprintf (pmi->fd, "cmd=init pmi_version=1 pmi_subversion=1\n") < 0) goto done; if (dgetline (pmi->fd, pmi->buf, sizeof (pmi->buf)) < 0) goto done; if (keyval_parse_isword (pmi->buf, "cmd", "response_to_init") < 0) goto done; if (keyval_parse_int (pmi->buf, "rc", &rc) == 0 && rc != 0) { result = rc; goto done; } if (keyval_parse_uint (pmi->buf, "pmi_version", &vers) < 0 || keyval_parse_uint (pmi->buf, "pmi_subversion", &subvers) < 0) goto done; if (vers != 1 || subvers != 1) goto done; if (dprintf (pmi->fd, "cmd=get_maxes\n") < 0) goto done; if (dgetline (pmi->fd, pmi->buf, sizeof (pmi->buf)) < 0) goto done; if (keyval_parse_isword (pmi->buf, "cmd", "maxes") < 0) goto done; if (keyval_parse_int (pmi->buf, "rc", &rc) == 0 && rc != 0) { result = rc; goto done; } if (keyval_parse_uint (pmi->buf, "kvsname_max", &pmi->kvsname_max) < 0 || keyval_parse_uint (pmi->buf, "keylen_max", &pmi->keylen_max) < 0 || keyval_parse_uint (pmi->buf, "vallen_max", &pmi->vallen_max) < 0) goto done; pmi->initialized = 1; if (spawned) *spawned = pmi->spawned; result = PMI_SUCCESS; done: return result; }
int pmi_simple_client_finalize (struct pmi_simple_client *pmi) { int result = PMI_FAIL; int rc; if (dprintf (pmi->fd, "cmd=finalize\n") < 0) goto done; if (dgetline (pmi->fd, pmi->buf, sizeof (pmi->buf)) < 0) goto done; if (keyval_parse_isword (pmi->buf, "cmd", "finalize_ack") < 0) goto done; if (keyval_parse_int (pmi->buf, "rc", &rc) == 0 && rc != 0) { result = rc; goto done; } result = PMI_SUCCESS; done: return result; }
int pmi_simple_client_barrier (struct pmi_simple_client *pmi) { int result = PMI_FAIL; int rc; if (!pmi->initialized) goto done; if (dprintf (pmi->fd, "cmd=barrier_in\n") < 0) goto done; if (dgetline (pmi->fd, pmi->buf, sizeof (pmi->buf)) < 0) goto done; if (keyval_parse_isword (pmi->buf, "cmd", "barrier_out") < 0) goto done; if (keyval_parse_int (pmi->buf, "rc", &rc) == 0 && rc != 0) { result = rc; goto done; } result = PMI_SUCCESS; done: return result; }
int pmi_simple_client_get_appnum (struct pmi_simple_client *pmi, int *appnum) { int result = PMI_FAIL; int rc; if (!pmi->initialized) goto done; if (dprintf (pmi->fd, "cmd=get_appnum\n") < 0) goto done; if (dgetline (pmi->fd, pmi->buf, sizeof (pmi->buf)) < 0) goto done; if (keyval_parse_isword (pmi->buf, "cmd", "appnum") < 0) goto done; if (keyval_parse_int (pmi->buf, "rc", &rc) == 0 && rc != 0) { result = rc; goto done; } if (keyval_parse_int (pmi->buf, "appnum", appnum) < 0) goto done; result = PMI_SUCCESS; done: return result; }
static void s_io_cb (flux_reactor_t *r, flux_watcher_t *w, int revents, void *arg) { struct context *ctx = arg; int fd = flux_fd_watcher_get_fd (w); int rc; if (dgetline (fd, ctx->buf, sizeof (ctx->buf)) < 0) { diag ("dgetline: %s", strerror (errno)); flux_reactor_stop_error (r); return; } rc = pmi_simple_server_request (ctx->pmi, ctx->buf, &ctx->fds[1]); if (rc < 0) { diag ("pmi_simple_server_request: %s", strerror (errno)); flux_reactor_stop_error (r); return; } if (rc == 1) { close (fd); flux_watcher_stop (w); } }
int pmi_simple_client_kvs_get_my_name (struct pmi_simple_client *pmi, char *kvsname, int length) { int result = PMI_FAIL; int rc; if (!pmi->initialized) goto done; if (dprintf (pmi->fd, "cmd=get_my_kvsname\n") < 0) goto done; if (dgetline (pmi->fd, pmi->buf, sizeof (pmi->buf)) < 0) goto done; if (keyval_parse_isword (pmi->buf, "cmd", "my_kvsname") < 0) goto done; if (keyval_parse_int (pmi->buf, "rc", &rc) == 0 && rc != 0) { result = rc; goto done; } if (keyval_parse_word (pmi->buf, "kvsname", kvsname, length) < 0) goto done; result = PMI_SUCCESS; done: return result; }
int pmi_simple_client_kvs_put (struct pmi_simple_client *pmi, const char *kvsname, const char *key, const char *value) { int result = PMI_FAIL; int rc; if (!pmi->initialized) goto done; if (dprintf (pmi->fd, "cmd=put kvsname=%s key=%s value=%s\n", kvsname, key, value) < 0) goto done; if (dgetline (pmi->fd, pmi->buf, pmi->buflen) < 0) goto done; if (keyval_parse_isword (pmi->buf, "cmd", "put_result") < 0) goto done; if (keyval_parse_int (pmi->buf, "rc", &rc) == 0 && rc != 0) { result = rc; goto done; } result = PMI_SUCCESS; done: return result; }
int pmi_simple_client_get_universe_size (struct pmi_simple_client *pmi, int *universe_size) { int result = PMI_FAIL; int rc; if (!pmi->initialized) goto done; if (dprintf (pmi->fd, "cmd=get_universe_size\n") < 0) goto done; if (dgetline (pmi->fd, pmi->buf, pmi->buflen) < 0) goto done; if (keyval_parse_isword (pmi->buf, "cmd", "universe_size") < 0) goto done; if (keyval_parse_int (pmi->buf, "rc", &rc) == 0 && rc != 0) { result = rc; goto done; } if (keyval_parse_int (pmi->buf, "size", universe_size) < 0) goto done; result = PMI_SUCCESS; done: return result; }