void pmi_put_uri (pmi_t *pmi, int rank, const char *uri) { pmi_kvs_put (pmi, uri, "cmbd.%d.uri", rank); }
void pmi_put_relay (pmi_t *pmi, int rank, const char *uri) { pmi_kvs_put (pmi, uri, "cmbd.%d.relay", rank); }
int main (int argc, char *argv[]) { struct context ctx; struct pmi_simple_ops ops = { .kvs_put = s_kvs_put, .kvs_get = s_kvs_get, .barrier = s_barrier, }; pmi_t *cli; int spawned = -1, initialized = -1; int rank = -1, size = -1; int universe_size = -1; int name_len = -1, key_len = -1, val_len = -1; char *name = NULL, *val = NULL, *val2 = NULL; plan (NO_PLAN); if (!(ctx.kvs = zhash_new ())) oom (); ctx.size = 1; ctx.barrier = 0; ok (socketpair (PF_LOCAL, SOCK_STREAM | SOCK_CLOEXEC, 0, ctx.fds) == 0, "socketpair returned client,server file descriptors"); ctx.pmi = pmi_simple_server_create (&ops, 42, ctx.size, "bleepgorp", &ctx); ok (ctx.pmi != NULL, "created simple pmi server context"); ctx.buflen = pmi_simple_server_get_maxrequest (ctx.pmi); ctx.buf = xzmalloc (ctx.buflen); ok (pthread_create (&ctx.t, NULL, server_thread, &ctx) == 0, "pthread_create successfully started server"); ok ((cli = pmi_create_simple (ctx.fds[0], 0, ctx.size)) != NULL, "pmi_create_simple OK"); ok (pmi_initialized (cli, &initialized) == PMI_SUCCESS && initialized == 0, "pmi_initialized OK, initialized=0"); ok (pmi_init (cli, &spawned) == PMI_SUCCESS && spawned == 0, "pmi_init OK, spawned=0"); ok (pmi_initialized (cli, &initialized) == PMI_SUCCESS && initialized == 1, "pmi_initialized OK, initialized=1"); /* retrieve basic params */ ok (pmi_get_size (cli, &size) == PMI_SUCCESS && size == 1, "pmi_get_size OK, size=%d", size); ok (pmi_get_rank (cli, &rank) == PMI_SUCCESS && rank == 0, "pmi_get_rank OK, rank=%d", rank); ok (pmi_get_universe_size (cli, &universe_size) == PMI_SUCCESS && universe_size == size, "pmi_get_universe_size OK, universe_size=%d", universe_size); ok (pmi_kvs_get_name_length_max (cli, &name_len) == PMI_SUCCESS && name_len > 0, "pmi_kvs_get_name_length_max OK, name_len=%d", name_len); ok (pmi_kvs_get_key_length_max (cli, &key_len) == PMI_SUCCESS && key_len > 0, "pmi_kvs_get_key_length_max OK, key_len=%d", key_len); ok (pmi_kvs_get_value_length_max (cli, &val_len) == PMI_SUCCESS && val_len > 0, "pmi_kvs_get_value_length_max OK, val_len=%d", val_len); name = xzmalloc (name_len); ok (pmi_kvs_get_my_name (cli, name, name_len) == PMI_SUCCESS && strlen (name) > 0, "pmi_kvs_get_my_name OK, name=%s", name); /* put foo=bar / commit / barier / get foo */ ok (pmi_kvs_put (cli, name, "foo", "bar") == PMI_SUCCESS, "pmi_kvs_put foo=bar OK"); ok (pmi_kvs_commit (cli, name) == PMI_SUCCESS, "pmi_kvs_commit OK"); ok (pmi_barrier (cli) == PMI_SUCCESS, "pmi_barrier OK"); val = xzmalloc (val_len); ok (pmi_kvs_get (cli, name, "foo", val, val_len) == PMI_SUCCESS && !strcmp (val, "bar"), "pmi_kvs_get foo OK, val=%s", val); /* put long=... / get long */ val2 = xzmalloc (val_len); memset (val2, 'x', val_len - 1); ok (pmi_kvs_put (cli, name, "long", val2) == PMI_SUCCESS, "pmi_kvs_put long=xxx... OK"); memset (val, 'y', val_len); /* not null terminated */ ok (pmi_kvs_get (cli, name, "long", val, val_len) == PMI_SUCCESS && strnlen (val2, val_len) < val_len && strcmp (val, val2) == 0, "pmi_kvs_get long OK, val=xxx..."); ok (pmi_finalize (cli) == PMI_SUCCESS, "pmi_finalize OK"); ok (pthread_join (ctx.t, NULL) == 0, "pthread join successfully reaped server"); free (name); free (val); free (val2); pmi_destroy (cli); if (ctx.pmi) pmi_simple_server_destroy (ctx.pmi); close (ctx.fds[0]); close (ctx.fds[1]); zhash_destroy (&ctx.kvs); done_testing (); return 0; }