예제 #1
0
void pmi_put_uri (pmi_t *pmi, int rank, const char *uri)
{
    pmi_kvs_put (pmi, uri, "cmbd.%d.uri", rank);
}
예제 #2
0
void pmi_put_relay (pmi_t *pmi, int rank, const char *uri)
{
    pmi_kvs_put (pmi, uri, "cmbd.%d.relay", rank);
}
예제 #3
0
파일: simple.c 프로젝트: cigolabs/flux-core
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;
}