[mpich2-commits] r4155 - mpich2/trunk/src/pm/hydra/pm/pmiserv

balaji at mcs.anl.gov balaji at mcs.anl.gov
Fri Mar 20 23:05:44 CDT 2009


Author: balaji
Date: 2009-03-20 23:05:44 -0500 (Fri, 20 Mar 2009)
New Revision: 4155

Added:
   mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_handle.c
   mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_handle.h
   mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_handle_v1.c
   mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_handle_v1.h
Removed:
   mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_query.c
   mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_query.h
Modified:
   mpich2/trunk/src/pm/hydra/pm/pmiserv/Makefile.sm
   mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_serv_cb.c
   mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_serv_finalize.c
   mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_serv_launch.c
Log:
Suck in all the PMI related functionality into the process manager
component, instead of leaving it in the utilities. We are trying to
make the process manager more general than just PMI.

Also, refactored the process manager code to dynamically pick what PMI
version we want to use, i.e., PMI-1 or PMI-2 (though the code for
PMI-2 is not in place yet). There are still some hacks because the PMI
client seems to be misbehaving with respect to the order in which it
sends init and initack; this needs to be investigated.


Modified: mpich2/trunk/src/pm/hydra/pm/pmiserv/Makefile.sm
===================================================================
--- mpich2/trunk/src/pm/hydra/pm/pmiserv/Makefile.sm	2009-03-20 23:39:20 UTC (rev 4154)
+++ mpich2/trunk/src/pm/hydra/pm/pmiserv/Makefile.sm	2009-03-21 04:05:44 UTC (rev 4155)
@@ -5,7 +5,8 @@
 #
 
 libhydra_a_DIR = ../../lib
-libhydra_a_SOURCES = pmi_serv_launch.c pmi_serv_finalize.c pmi_serv_cb.c pmi_query.c
+libhydra_a_SOURCES = pmi_serv_launch.c pmi_serv_finalize.c pmi_serv_cb.c \
+	pmi_handle.c pmi_handle_v1.c
 INCLUDES = -I${abs_srcdir}/../../include \
 	-I${abs_srcdir}/../../../../include \
 	-I../../include \
@@ -17,7 +18,7 @@
 	-I../../bootstrap/include \
 	-I${abs_srcdir}/../../demux
 
-pmi_proxy_SOURCES = pmi_proxy.c pmi_proxy_utils.c pmi_proxy_cb.c pmi_query.c
+pmi_proxy_SOURCES = pmi_proxy.c pmi_proxy_utils.c pmi_proxy_cb.c
 pmi_proxy_LDADD = -L../../lib -lhydra -L../../../util -lmpiexec -L../../../../../lib -lmpich
 pmi_proxy_DEPADD = ../../../util/libmpiexec.a
 install_BIN = pmi_proxy

Added: mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_handle.c
===================================================================
--- mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_handle.c	                        (rev 0)
+++ mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_handle.c	2009-03-21 04:05:44 UTC (rev 4155)
@@ -0,0 +1,191 @@
+/* -*- Mode: C; c-basic-offset:4 ; -*- */
+/*
+ *  (C) 2008 by Argonne National Laboratory.
+ *      See COPYRIGHT in top-level directory.
+ */
+
+#include "hydra.h"
+#include "pmi_handle.h"
+#include "pmi_handle_v1.h"
+
+HYD_Handle handle;
+HYD_PMCD_pmi_pg_t *pg_list = NULL;
+
+struct HYD_PMCD_pmi_handle *HYD_PMCD_pmi_v1;
+
+static HYD_Status allocate_kvs(HYD_PMCD_pmi_kvs_t ** kvs, int pgid)
+{
+    HYD_Status status = HYD_SUCCESS;
+
+    HYDU_FUNC_ENTER();
+
+    HYDU_MALLOC(*kvs, HYD_PMCD_pmi_kvs_t *, sizeof(HYD_PMCD_pmi_kvs_t), status);
+    MPIU_Snprintf((*kvs)->kvs_name, MAXNAMELEN, "kvs_%d_%d", (int) getpid(), pgid);
+    (*kvs)->key_pair = NULL;
+
+  fn_exit:
+    HYDU_FUNC_EXIT();
+    return status;
+
+  fn_fail:
+    goto fn_exit;
+}
+
+
+static HYD_Status create_pg(HYD_PMCD_pmi_pg_t ** pg, int pgid)
+{
+    HYD_Status status = HYD_SUCCESS;
+
+    HYDU_FUNC_ENTER();
+
+    HYDU_MALLOC(*pg, HYD_PMCD_pmi_pg_t *, sizeof(HYD_PMCD_pmi_pg_t), status);
+    (*pg)->id = pgid;
+    (*pg)->num_procs = 0;
+    (*pg)->barrier_count = 0;
+    (*pg)->process = NULL;
+
+    status = allocate_kvs(&(*pg)->kvs, pgid);
+    HYDU_ERR_POP(status, "unable to allocate kvs space\n");
+
+    (*pg)->next = NULL;
+
+  fn_exit:
+    HYDU_FUNC_EXIT();
+    return status;
+
+  fn_fail:
+    goto fn_exit;
+}
+
+
+static HYD_Status free_pmi_process_list(HYD_PMCD_pmi_process_t * process_list)
+{
+    HYD_PMCD_pmi_process_t *process, *tmp;
+    HYD_Status status = HYD_SUCCESS;
+
+    HYDU_FUNC_ENTER();
+
+    process = process_list;
+    while (process) {
+        tmp = process->next;
+        HYDU_FREE(process);
+        process = tmp;
+    }
+
+    HYDU_FUNC_EXIT();
+    return status;
+}
+
+
+static HYD_Status free_pmi_kvs_list(HYD_PMCD_pmi_kvs_t * kvs_list)
+{
+    HYD_PMCD_pmi_kvs_pair_t *key_pair, *tmp;
+    HYD_Status status = HYD_SUCCESS;
+
+    HYDU_FUNC_ENTER();
+
+    key_pair = kvs_list->key_pair;
+    while (key_pair) {
+        tmp = key_pair->next;
+        HYDU_FREE(key_pair);
+        key_pair = tmp;
+    }
+    HYDU_FREE(kvs_list);
+
+    HYDU_FUNC_EXIT();
+    return status;
+}
+
+
+HYD_Status HYD_PMCD_pmi_create_pg(void)
+{
+    struct HYD_Proc_params *proc_params;
+    int num_procs;
+    HYD_Status status = HYD_SUCCESS;
+
+    HYDU_FUNC_ENTER();
+
+    /* Find the number of processes in the PG */
+    num_procs = 0;
+    proc_params = handle.proc_params;
+    while (proc_params) {
+        num_procs += proc_params->exec_proc_count;
+        proc_params = proc_params->next;
+    }
+
+    status = create_pg(&pg_list, 0);
+    HYDU_ERR_POP(status, "unable to create pg\n");
+    pg_list->num_procs = num_procs;
+
+  fn_exit:
+    HYDU_FUNC_EXIT();
+    return status;
+
+  fn_fail:
+    goto fn_exit;
+}
+
+
+HYD_Status HYD_PMCD_pmi_finalize(void)
+{
+    HYD_PMCD_pmi_pg_t *pg, *tmp;
+    HYD_Status status = HYD_SUCCESS;
+
+    HYDU_FUNC_ENTER();
+
+    pg = pg_list;
+    while (pg) {
+        tmp = pg->next;
+
+        status = free_pmi_process_list(pg->process);
+        HYDU_ERR_POP(status, "unable to free process list\n");
+
+        status = free_pmi_kvs_list(pg->kvs);
+        HYDU_ERR_POP(status, "unable to free kvs list\n");
+
+        HYDU_FREE(pg);
+        pg = tmp;
+    }
+
+  fn_exit:
+    HYDU_FUNC_EXIT();
+    return status;
+
+  fn_fail:
+    goto fn_exit;
+}
+
+
+HYD_Status HYD_PMCD_pmi_init(int fd, char *args[])
+{
+    int pmi_version, pmi_subversion;
+    char *tmp[HYDU_NUM_JOIN_STR];
+    HYD_Status status = HYD_SUCCESS;
+
+    HYDU_FUNC_ENTER();
+
+    strtok(args[0], "=");
+    pmi_version = atoi(strtok(NULL, "="));
+    strtok(args[1], "=");
+    pmi_subversion = atoi(strtok(NULL, "="));
+
+    if (pmi_version == 1 && pmi_subversion <= 1) {
+        /* We support PMI v1.0 and 1.1 */
+        tmp[0] = "cmd=response_to_init pmi_version=1 pmi_subversion=1 rc=0\n";
+        status = HYDU_sock_writeline(fd, tmp[0], strlen(tmp[0]));
+        HYDU_ERR_POP(status, "error writing PMI line\n");
+        HYD_PMCD_pmi_handle_list = HYD_PMCD_pmi_v1;
+    }
+    else {
+        /* PMI version mismatch */
+        HYDU_ERR_SETANDJUMP2(status, HYD_INTERNAL_ERROR,
+                             "PMI version mismatch; %d.%d\n", pmi_version, pmi_subversion);
+    }
+
+fn_exit:
+    HYDU_FUNC_EXIT();
+    return status;
+
+fn_fail:
+    goto fn_exit;
+}

Copied: mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_handle.h (from rev 4154, mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_query.h)
===================================================================
--- mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_handle.h	                        (rev 0)
+++ mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_handle.h	2009-03-21 04:05:44 UTC (rev 4155)
@@ -0,0 +1,66 @@
+/* -*- Mode: C; c-basic-offset:4 ; -*- */
+/*
+ *  (C) 2008 by Argonne National Laboratory.
+ *      See COPYRIGHT in top-level directory.
+ */
+
+#ifndef PMI_HANDLE_H_INCLUDED
+#define PMI_HANDLE_H_INCLUDED
+
+#include "hydra_base.h"
+
+#define MAXKEYLEN    64 /* max length of key in keyval space */
+#define MAXVALLEN   256 /* max length of value in keyval space */
+#define MAXNAMELEN  256 /* max length of various names */
+#define MAXKVSNAME  MAXNAMELEN  /* max length of a kvsname */
+
+typedef struct HYD_PMCD_pmi_kvs_pair {
+    char key[MAXKEYLEN];
+    char val[MAXVALLEN];
+    struct HYD_PMCD_pmi_kvs_pair *next;
+} HYD_PMCD_pmi_kvs_pair_t;
+
+typedef struct HYD_PMCD_pmi_kvs {
+    char kvs_name[MAXNAMELEN];  /* Name of this kvs */
+    HYD_PMCD_pmi_kvs_pair_t *key_pair;
+} HYD_PMCD_pmi_kvs_t;
+
+typedef struct HYD_PMCD_pmi_pg HYD_PMCD_pmi_pg_t;
+typedef struct HYD_PMCD_pmi_process HYD_PMCD_pmi_process_t;
+
+struct HYD_PMCD_pmi_process {
+    /* This is a bad design if we need to tie in an FD to a PMI
+     * process. This essentially kills any chance of PMI server
+     * masquerading. However, PMI v1 requires this state to be
+     * maintained. */
+    int fd;
+    struct HYD_PMCD_pmi_pg *pg;
+    struct HYD_PMCD_pmi_process *next;
+};
+
+struct HYD_PMCD_pmi_pg {
+    int id;
+
+    int num_procs;              /* Number of processes in the group */
+    int barrier_count;
+
+    struct HYD_PMCD_pmi_process *process;
+    HYD_PMCD_pmi_kvs_t *kvs;
+
+    struct HYD_PMCD_pmi_pg *next;
+};
+
+HYD_Status HYD_PMCD_pmi_create_pg(void);
+HYD_Status HYD_PMCD_pmi_init(int fd, char *args[]);
+HYD_Status HYD_PMCD_pmi_finalize(void);
+
+extern HYD_PMCD_pmi_pg_t *pg_list;
+
+struct HYD_PMCD_pmi_handle {
+    char *cmd;
+    HYD_Status (*handler)(int fd, char *args[]);
+};
+
+extern struct HYD_PMCD_pmi_handle *HYD_PMCD_pmi_handle_list;
+
+#endif /* PMI_HANDLE_H_INCLUDED */


Property changes on: mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_handle.h
___________________________________________________________________
Name: svn:mergeinfo
   + 

Copied: mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_handle_v1.c (from rev 4154, mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_query.c)
===================================================================
--- mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_handle_v1.c	                        (rev 0)
+++ mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_handle_v1.c	2009-03-21 04:05:44 UTC (rev 4155)
@@ -0,0 +1,573 @@
+/* -*- Mode: C; c-basic-offset:4 ; -*- */
+/*
+ *  (C) 2008 by Argonne National Laboratory.
+ *      See COPYRIGHT in top-level directory.
+ */
+
+#include "hydra.h"
+#include "hydra_utils.h"
+#include "bsci.h"
+#include "pmi_handle.h"
+#include "pmi_handle_v1.h"
+
+HYD_Handle handle;
+HYD_PMCD_pmi_pg_t *pg_list;
+
+/* TODO: abort, create_kvs, destroy_kvs, getbyidx, spawn */
+struct HYD_PMCD_pmi_handle HYD_PMCD_pmi_v1_foo[] = {
+    { "initack",           HYD_PMCD_pmi_handle_v1_initack },
+    { "get_maxes",         HYD_PMCD_pmi_handle_v1_get_maxes },
+    { "get_appnum",        HYD_PMCD_pmi_handle_v1_get_appnum },
+    { "get_my_kvsname",    HYD_PMCD_pmi_handle_v1_get_my_kvsname },
+    { "barrier_in",        HYD_PMCD_pmi_handle_v1_barrier_in },
+    { "put",               HYD_PMCD_pmi_handle_v1_put },
+    { "get",               HYD_PMCD_pmi_handle_v1_get },
+    { "get_universe_size", HYD_PMCD_pmi_handle_v1_get_usize },
+    { "finalize",          HYD_PMCD_pmi_handle_v1_finalize },
+    { "\0",                NULL }
+};
+struct HYD_PMCD_pmi_handle *HYD_PMCD_pmi_v1 = HYD_PMCD_pmi_v1_foo;
+
+static HYD_Status add_process_to_pg(HYD_PMCD_pmi_pg_t * pg, int fd)
+{
+    HYD_PMCD_pmi_process_t *process, *tmp;
+    HYD_Status status = HYD_SUCCESS;
+
+    HYDU_FUNC_ENTER();
+
+    HYDU_MALLOC(process, HYD_PMCD_pmi_process_t *, sizeof(HYD_PMCD_pmi_process_t), status);
+    process->fd = fd;
+    process->pg = pg;
+    process->next = NULL;
+    if (pg->process == NULL)
+        pg->process = process;
+    else {
+        tmp = pg->process;
+        while (tmp->next)
+            tmp = tmp->next;
+        tmp->next = process;
+    }
+
+  fn_exit:
+    HYDU_FUNC_EXIT();
+    return status;
+
+  fn_fail:
+    goto fn_exit;
+}
+
+
+static HYD_PMCD_pmi_process_t *find_process(int fd)
+{
+    HYD_PMCD_pmi_pg_t *pg;
+    HYD_PMCD_pmi_process_t *process = NULL;
+
+    pg = pg_list;
+    while (pg) {
+        process = pg->process;
+        while (process) {
+            if (process->fd == fd)
+                break;
+            process = process->next;
+        }
+        pg = pg->next;
+    }
+
+    return process;
+}
+
+
+static HYD_Status free_pmi_kvs_list(HYD_PMCD_pmi_kvs_t * kvs_list)
+{
+    HYD_PMCD_pmi_kvs_pair_t *key_pair, *tmp;
+    HYD_Status status = HYD_SUCCESS;
+
+    HYDU_FUNC_ENTER();
+
+    key_pair = kvs_list->key_pair;
+    while (key_pair) {
+        tmp = key_pair->next;
+        HYDU_FREE(key_pair);
+        key_pair = tmp;
+    }
+    HYDU_FREE(kvs_list);
+
+    HYDU_FUNC_EXIT();
+    return status;
+}
+
+
+HYD_Status HYD_PMCD_pmi_handle_v1_initack(int fd, char *args[])
+{
+    int id, size, debug, i;
+    char *ssize, *srank, *sdebug, *tmp[HYDU_NUM_JOIN_STR], *cmd;
+    struct HYD_Proc_params *proc_params;
+    HYD_PMCD_pmi_pg_t *run;
+    HYD_Status status = HYD_SUCCESS;
+
+    HYDU_FUNC_ENTER();
+
+    strtok(args[0], "=");
+    id = atoi(strtok(NULL, "="));
+
+    size = 0;
+    proc_params = handle.proc_params;
+    while (proc_params) {
+        size += proc_params->exec_proc_count;
+        proc_params = proc_params->next;
+    }
+    debug = handle.debug;
+
+    status = HYDU_int_to_str(size, &ssize);
+    HYDU_ERR_POP(status, "unable to convert int to string\n");
+
+    status = HYDU_int_to_str(id, &srank);
+    HYDU_ERR_POP(status, "unable to convert int to string\n");
+
+    status = HYDU_int_to_str(debug, &sdebug);
+    HYDU_ERR_POP(status, "unable to convert int to string\n");
+
+    i = 0;
+    tmp[i++] = "cmd=initack\ncmd=set size=";
+    tmp[i++] = ssize;
+    tmp[i++] = "\ncmd=set rank=";
+    tmp[i++] = srank;
+    tmp[i++] = "\ncmd=set debug=";
+    tmp[i++] = sdebug;
+    tmp[i++] = "\n";
+    tmp[i++] = NULL;
+
+    status = HYDU_str_alloc_and_join(tmp, &cmd);
+    HYDU_ERR_POP(status, "error while joining strings\n");
+
+    status = HYDU_sock_writeline(fd, cmd, strlen(cmd));
+    HYDU_ERR_POP(status, "error writing PMI line\n");
+
+    HYDU_FREE(ssize);
+    HYDU_FREE(srank);
+    HYDU_FREE(sdebug);
+    HYDU_FREE(cmd);
+
+    run = pg_list;
+    while (run->next)
+        run = run->next;
+
+    /* Add the process to the last PG */
+    status = add_process_to_pg(run, fd);
+    HYDU_ERR_POP(status, "unable to add process to pg\n");
+
+  fn_exit:
+    HYDU_FUNC_EXIT();
+    return status;
+
+  fn_fail:
+    goto fn_exit;
+}
+
+
+HYD_Status HYD_PMCD_pmi_handle_v1_init(int fd, char *args[])
+{
+    int pmi_version, pmi_subversion;
+    char *tmp[HYDU_NUM_JOIN_STR];
+    HYD_Status status = HYD_SUCCESS;
+
+    HYDU_FUNC_ENTER();
+
+    strtok(args[0], "=");
+    pmi_version = atoi(strtok(NULL, "="));
+    strtok(args[1], "=");
+    pmi_subversion = atoi(strtok(NULL, "="));
+
+    if (pmi_version == 1 && pmi_subversion <= 1) {
+        /* We support PMI v1.0 and 1.1 */
+        tmp[0] = "cmd=response_to_init pmi_version=1 pmi_subversion=1 rc=0\n";
+        status = HYDU_sock_writeline(fd, tmp[0], strlen(tmp[0]));
+        HYDU_ERR_POP(status, "error writing PMI line\n");
+    }
+    else {
+        /* PMI version mismatch */
+        HYDU_ERR_SETANDJUMP2(status, HYD_INTERNAL_ERROR,
+                             "PMI version mismatch; %d.%d\n", pmi_version, pmi_subversion);
+    }
+
+  fn_exit:
+    HYDU_FUNC_EXIT();
+    return status;
+
+  fn_fail:
+    goto fn_exit;
+}
+
+
+HYD_Status HYD_PMCD_pmi_handle_v1_get_maxes(int fd, char *args[])
+{
+    int i;
+    char *tmp[HYDU_NUM_JOIN_STR], *cmd;
+    char *maxkvsname, *maxkeylen, *maxvallen;
+    HYD_Status status = HYD_SUCCESS;
+
+    HYDU_FUNC_ENTER();
+
+    status = HYDU_int_to_str(MAXKVSNAME, &maxkvsname);
+    HYDU_ERR_POP(status, "unable to convert int to string\n");
+
+    status = HYDU_int_to_str(MAXKEYLEN, &maxkeylen);
+    HYDU_ERR_POP(status, "unable to convert int to string\n");
+
+    status = HYDU_int_to_str(MAXVALLEN, &maxvallen);
+    HYDU_ERR_POP(status, "unable to convert int to string\n");
+
+    i = 0;
+    tmp[i++] = "cmd=maxes kvsname_max=";
+    tmp[i++] = maxkvsname;
+    tmp[i++] = " keylen_max=";
+    tmp[i++] = maxkeylen;
+    tmp[i++] = " vallen_max=";
+    tmp[i++] = maxvallen;
+    tmp[i++] = "\n";
+    tmp[i++] = NULL;
+
+    status = HYDU_str_alloc_and_join(tmp, &cmd);
+    HYDU_ERR_POP(status, "unable to join strings\n");
+
+    status = HYDU_sock_writeline(fd, cmd, strlen(cmd));
+    HYDU_ERR_POP(status, "error writing PMI line\n");
+    HYDU_FREE(cmd);
+
+    HYDU_FREE(maxkvsname);
+    HYDU_FREE(maxkeylen);
+    HYDU_FREE(maxvallen);
+
+  fn_exit:
+    HYDU_FUNC_EXIT();
+    return status;
+
+  fn_fail:
+    goto fn_exit;
+}
+
+
+HYD_Status HYD_PMCD_pmi_handle_v1_get_appnum(int fd, char *args[])
+{
+    char *tmp[HYDU_NUM_JOIN_STR], *cmd;
+    char *sapp_num;
+    int i;
+    HYD_PMCD_pmi_process_t *process;
+    HYD_Status status = HYD_SUCCESS;
+
+    HYDU_FUNC_ENTER();
+
+    /* Find the group id corresponding to this fd */
+    process = find_process(fd);
+    if (process == NULL) /* We didn't find the process */
+        HYDU_ERR_SETANDJUMP(status, HYD_INTERNAL_ERROR,
+                            "unable to find process structure\n");
+
+    status = HYDU_int_to_str(process->pg->id, &sapp_num);
+    HYDU_ERR_POP(status, "unable to convert int to string\n");
+
+    i = 0;
+    tmp[i++] = "cmd=appnum appnum=";
+    tmp[i++] = sapp_num;
+    tmp[i++] = "\n";
+    tmp[i++] = NULL;
+
+    status = HYDU_str_alloc_and_join(tmp, &cmd);
+    HYDU_ERR_POP(status, "unable to join strings\n");
+
+    status = HYDU_sock_writeline(fd, cmd, strlen(cmd));
+    HYDU_ERR_POP(status, "error writing PMI line\n");
+    HYDU_FREE(cmd);
+
+    HYDU_FREE(sapp_num);
+
+  fn_exit:
+    HYDU_FUNC_EXIT();
+    return status;
+
+  fn_fail:
+    goto fn_exit;
+}
+
+
+HYD_Status HYD_PMCD_pmi_handle_v1_get_my_kvsname(int fd, char *args[])
+{
+    char *tmp[HYDU_NUM_JOIN_STR], *cmd;
+    int i;
+    HYD_PMCD_pmi_process_t *process;
+    HYD_Status status = HYD_SUCCESS;
+
+    HYDU_FUNC_ENTER();
+
+    /* Find the group id corresponding to this fd */
+    process = find_process(fd);
+    if (process == NULL) /* We didn't find the process */
+        HYDU_ERR_SETANDJUMP1(status, HYD_INTERNAL_ERROR,
+                             "unable to find process structure for fd %d\n", fd);
+
+    i = 0;
+    tmp[i++] = "cmd=my_kvsname kvsname=";
+    tmp[i++] = process->pg->kvs->kvs_name;
+    tmp[i++] = "\n";
+    tmp[i++] = NULL;
+
+    status = HYDU_str_alloc_and_join(tmp, &cmd);
+    HYDU_ERR_POP(status, "unable to join strings\n");
+
+    status = HYDU_sock_writeline(fd, cmd, strlen(cmd));
+    HYDU_ERR_POP(status, "error writing PMI line\n");
+    HYDU_FREE(cmd);
+
+  fn_exit:
+    HYDU_FUNC_EXIT();
+    return status;
+
+  fn_fail:
+    goto fn_exit;
+}
+
+
+HYD_Status HYD_PMCD_pmi_handle_v1_barrier_in(int fd, char *args[])
+{
+    HYD_PMCD_pmi_process_t *process, *run;
+    char *cmd;
+    HYD_Status status = HYD_SUCCESS;
+
+    HYDU_FUNC_ENTER();
+
+    /* Find the group id corresponding to this fd */
+    process = find_process(fd);
+    if (process == NULL) /* We didn't find the process */
+        HYDU_ERR_SETANDJUMP1(status, HYD_INTERNAL_ERROR,
+                             "unable to find process structure for fd %d\n", fd);
+
+    process->pg->barrier_count++;
+
+    /* All the processes have arrived at the barrier; send a
+     * barrier_out message to everyone. */
+    if (process->pg->barrier_count == process->pg->num_procs) {
+        cmd = "cmd=barrier_out\n";
+        run = process->pg->process;     /* The first process in the list */
+        while (run) {
+            status = HYDU_sock_writeline(run->fd, cmd, strlen(cmd));
+            HYDU_ERR_POP(status, "error writing PMI line\n");
+            run = run->next;
+        }
+
+        process->pg->barrier_count = 0;
+    }
+
+  fn_exit:
+    HYDU_FUNC_EXIT();
+    return status;
+
+  fn_fail:
+    goto fn_exit;
+}
+
+
+HYD_Status HYD_PMCD_pmi_handle_v1_put(int fd, char *args[])
+{
+    int i;
+    HYD_PMCD_pmi_process_t *process;
+    HYD_PMCD_pmi_kvs_pair_t *key_pair, *run;
+    char *kvsname, *key, *val, *key_pair_str = NULL;
+    char *tmp[HYDU_NUM_JOIN_STR], *cmd;
+    HYD_Status status = HYD_SUCCESS;
+
+    HYDU_FUNC_ENTER();
+
+    strtok(args[0], "=");
+    kvsname = strtok(NULL, "=");
+    strtok(args[1], "=");
+    key = strtok(NULL, "=");
+    strtok(args[2], "=");
+    val = strtok(NULL, "=");
+
+    /* Find the group id corresponding to this fd */
+    process = find_process(fd);
+    if (process == NULL) /* We didn't find the process */
+        HYDU_ERR_SETANDJUMP1(status, HYD_INTERNAL_ERROR,
+                             "unable to find process structure for fd %d\n", fd);
+
+    if (strcmp(process->pg->kvs->kvs_name, kvsname))
+        HYDU_ERR_SETANDJUMP2(status, HYD_INTERNAL_ERROR,
+                             "kvsname (%s) does not match this process' kvs space (%s)\n",
+                             kvsname, process->pg->kvs->kvs_name);
+
+    HYDU_MALLOC(key_pair, HYD_PMCD_pmi_kvs_pair_t *, sizeof(HYD_PMCD_pmi_kvs_pair_t), status);
+    MPIU_Snprintf(key_pair->key, MAXKEYLEN, "%s", key);
+    MPIU_Snprintf(key_pair->val, MAXVALLEN, "%s", val);
+    key_pair->next = NULL;
+
+    i = 0;
+    tmp[i++] = "cmd=put_result rc=";
+    if (process->pg->kvs->key_pair == NULL) {
+        process->pg->kvs->key_pair = key_pair;
+        tmp[i++] = "0 msg=success";
+    }
+    else {
+        run = process->pg->kvs->key_pair;
+        while (run->next) {
+            if (!strcmp(run->key, key_pair->key)) {
+                tmp[i++] = "-1 msg=duplicate_key";
+                key_pair_str = MPIU_Strdup(key_pair->key);
+                tmp[i++] = key_pair_str;
+                break;
+            }
+            run = run->next;
+        }
+        run->next = key_pair;
+        tmp[i++] = "0 msg=success";
+    }
+    tmp[i++] = "\n";
+    tmp[i++] = NULL;
+
+    status = HYDU_str_alloc_and_join(tmp, &cmd);
+    HYDU_ERR_POP(status, "unable to join strings\n");
+
+    status = HYDU_sock_writeline(fd, cmd, strlen(cmd));
+    HYDU_ERR_POP(status, "error writing PMI line\n");
+    HYDU_FREE(cmd);
+    HYDU_FREE(key_pair_str);
+
+  fn_exit:
+    HYDU_FUNC_EXIT();
+    return status;
+
+  fn_fail:
+    goto fn_exit;
+}
+
+
+HYD_Status HYD_PMCD_pmi_handle_v1_get(int fd, char *args[])
+{
+    int i;
+    HYD_PMCD_pmi_process_t *process;
+    HYD_PMCD_pmi_kvs_pair_t *run;
+    char *kvsname, *key;
+    char *tmp[HYDU_NUM_JOIN_STR], *cmd, *key_val_str = NULL;
+    HYD_Status status = HYD_SUCCESS;
+
+    HYDU_FUNC_ENTER();
+
+    strtok(args[0], "=");
+    kvsname = strtok(NULL, "=");
+    strtok(args[1], "=");
+    key = strtok(NULL, "=");
+
+    /* Find the group id corresponding to this fd */
+    process = find_process(fd);
+    if (process == NULL) /* We didn't find the process */
+        HYDU_ERR_SETANDJUMP1(status, HYD_INTERNAL_ERROR,
+                             "unable to find process structure for fd %d\n", fd);
+
+    if (strcmp(process->pg->kvs->kvs_name, kvsname))
+        HYDU_ERR_SETANDJUMP2(status, HYD_INTERNAL_ERROR,
+                             "kvsname (%s) does not match this process' kvs space (%s)\n",
+                             kvsname, process->pg->kvs->kvs_name);
+
+    i = 0;
+    tmp[i++] = "cmd=get_result rc=";
+    if (process->pg->kvs->key_pair == NULL) {
+        tmp[i++] = "-1 msg=key_";
+        tmp[i++] = key;
+        tmp[i++] = "_not_found value=unknown";
+    }
+    else {
+        run = process->pg->kvs->key_pair;
+        while (run) {
+            if (!strcmp(run->key, key)) {
+                tmp[i++] = "0 msg=success value=";
+                key_val_str = MPIU_Strdup(run->val);
+                tmp[i++] = key_val_str;
+                break;
+            }
+            run = run->next;
+        }
+        if (run == NULL) {
+            tmp[i++] = "-1 msg=key_";
+            tmp[i++] = key;
+            tmp[i++] = "_not_found value=unknown";
+        }
+    }
+    tmp[i++] = "\n";
+    tmp[i++] = NULL;
+
+    status = HYDU_str_alloc_and_join(tmp, &cmd);
+    HYDU_ERR_POP(status, "unable to join strings\n");
+
+    status = HYDU_sock_writeline(fd, cmd, strlen(cmd));
+    HYDU_ERR_POP(status, "error writing PMI line\n");
+    HYDU_FREE(cmd);
+    HYDU_FREE(key_val_str);
+
+  fn_exit:
+    HYDU_FUNC_EXIT();
+    return status;
+
+  fn_fail:
+    goto fn_exit;
+}
+
+
+HYD_Status HYD_PMCD_pmi_handle_v1_finalize(int fd, char *args[])
+{
+    char *cmd;
+    HYD_Status status = HYD_SUCCESS;
+
+    HYDU_FUNC_ENTER();
+
+    cmd = "cmd=finalize_ack\n";
+    status = HYDU_sock_writeline(fd, cmd, strlen(cmd));
+    HYDU_ERR_POP(status, "error writing PMI line\n");
+
+    if (status == HYD_SUCCESS) {
+        status = HYD_DMX_deregister_fd(fd);
+        HYDU_ERR_POP(status, "unable to register fd\n");
+        close(fd);
+    }
+
+  fn_exit:
+    HYDU_FUNC_EXIT();
+    return status;
+
+  fn_fail:
+    goto fn_exit;
+}
+
+
+HYD_Status HYD_PMCD_pmi_handle_v1_get_usize(int fd, char *args[])
+{
+    int usize, i;
+    char *tmp[HYDU_NUM_JOIN_STR], *cmd, *usize_str;
+    HYD_Status status = HYD_SUCCESS;
+
+    HYDU_FUNC_ENTER();
+
+    status = HYD_BSCI_get_usize(&usize);
+    HYDU_ERR_POP(status, "unable to get bootstrap universe size\n");
+
+    status = HYDU_int_to_str(usize, &usize_str);
+    HYDU_ERR_POP(status, "unable to convert int to string\n");
+
+    i = 0;
+    tmp[i++] = "cmd=universe_size size=";
+    tmp[i++] = usize_str;
+    tmp[i++] = "\n";
+    tmp[i++] = NULL;
+
+    status = HYDU_str_alloc_and_join(tmp, &cmd);
+    HYDU_ERR_POP(status, "unable to join strings\n");
+
+    status = HYDU_sock_writeline(fd, cmd, strlen(cmd));
+    HYDU_ERR_POP(status, "error writing PMI line\n");
+    HYDU_FREE(cmd);
+
+  fn_exit:
+    HYDU_FUNC_EXIT();
+    return status;
+
+  fn_fail:
+    goto fn_exit;
+}


Property changes on: mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_handle_v1.c
___________________________________________________________________
Name: svn:mergeinfo
   + 

Added: mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_handle_v1.h
===================================================================
--- mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_handle_v1.h	                        (rev 0)
+++ mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_handle_v1.h	2009-03-21 04:05:44 UTC (rev 4155)
@@ -0,0 +1,25 @@
+/* -*- Mode: C; c-basic-offset:4 ; -*- */
+/*
+ *  (C) 2008 by Argonne National Laboratory.
+ *      See COPYRIGHT in top-level directory.
+ */
+
+#ifndef PMI_HANDLE_V1_H_INCLUDED
+#define PMI_HANDLE_V1_H_INCLUDED
+
+#include "pmi_handle.h"
+
+extern struct HYD_PMCD_pmi_handle *HYD_PMCD_pmi_v1;
+
+/* PMI handles */
+HYD_Status HYD_PMCD_pmi_handle_v1_initack(int fd, char *args[]);
+HYD_Status HYD_PMCD_pmi_handle_v1_get_maxes(int fd, char *args[]);
+HYD_Status HYD_PMCD_pmi_handle_v1_get_appnum(int fd, char *args[]);
+HYD_Status HYD_PMCD_pmi_handle_v1_get_my_kvsname(int fd, char *args[]);
+HYD_Status HYD_PMCD_pmi_handle_v1_barrier_in(int fd, char *args[]);
+HYD_Status HYD_PMCD_pmi_handle_v1_put(int fd, char *args[]);
+HYD_Status HYD_PMCD_pmi_handle_v1_get(int fd, char *args[]);
+HYD_Status HYD_PMCD_pmi_handle_v1_get_usize(int fd, char *args[]);
+HYD_Status HYD_PMCD_pmi_handle_v1_finalize(int fd, char *args[]);
+
+#endif /* PMI_HANDLE_V1_H_INCLUDED */

Deleted: mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_query.c
===================================================================
--- mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_query.c	2009-03-20 23:39:20 UTC (rev 4154)
+++ mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_query.c	2009-03-21 04:05:44 UTC (rev 4155)
@@ -1,674 +0,0 @@
-/* -*- Mode: C; c-basic-offset:4 ; -*- */
-/*
- *  (C) 2008 by Argonne National Laboratory.
- *      See COPYRIGHT in top-level directory.
- */
-
-#include "hydra.h"
-#include "hydra_utils.h"
-#include "bsci.h"
-#include "pmi_query.h"
-
-HYD_Handle handle;
-HYD_PMCD_pmi_pg_t *pg_list = NULL;
-
-static HYD_Status allocate_kvs(HYD_PMCD_pmi_kvs_t ** kvs, int pgid)
-{
-    HYD_Status status = HYD_SUCCESS;
-
-    HYDU_FUNC_ENTER();
-
-    HYDU_MALLOC(*kvs, HYD_PMCD_pmi_kvs_t *, sizeof(HYD_PMCD_pmi_kvs_t), status);
-    MPIU_Snprintf((*kvs)->kvs_name, MAXNAMELEN, "kvs_%d_%d", (int) getpid(), pgid);
-    (*kvs)->key_pair = NULL;
-
-  fn_exit:
-    HYDU_FUNC_EXIT();
-    return status;
-
-  fn_fail:
-    goto fn_exit;
-}
-
-
-static HYD_Status create_pg(HYD_PMCD_pmi_pg_t ** pg, int pgid)
-{
-    HYD_Status status = HYD_SUCCESS;
-
-    HYDU_FUNC_ENTER();
-
-    HYDU_MALLOC(*pg, HYD_PMCD_pmi_pg_t *, sizeof(HYD_PMCD_pmi_pg_t), status);
-    (*pg)->id = pgid;
-    (*pg)->num_procs = 0;
-    (*pg)->barrier_count = 0;
-    (*pg)->process = NULL;
-
-    status = allocate_kvs(&(*pg)->kvs, pgid);
-    HYDU_ERR_POP(status, "unable to allocate kvs space\n");
-
-    (*pg)->next = NULL;
-
-  fn_exit:
-    HYDU_FUNC_EXIT();
-    return status;
-
-  fn_fail:
-    goto fn_exit;
-}
-
-
-static HYD_Status add_process_to_pg(HYD_PMCD_pmi_pg_t * pg, int fd)
-{
-    HYD_PMCD_pmi_process_t *process, *tmp;
-    HYD_Status status = HYD_SUCCESS;
-
-    HYDU_FUNC_ENTER();
-
-    HYDU_MALLOC(process, HYD_PMCD_pmi_process_t *, sizeof(HYD_PMCD_pmi_process_t), status);
-    process->fd = fd;
-    process->pg = pg;
-    process->next = NULL;
-    if (pg->process == NULL)
-        pg->process = process;
-    else {
-        tmp = pg->process;
-        while (tmp->next)
-            tmp = tmp->next;
-        tmp->next = process;
-    }
-
-  fn_exit:
-    HYDU_FUNC_EXIT();
-    return status;
-
-  fn_fail:
-    goto fn_exit;
-}
-
-
-HYD_Status HYD_PMCD_pmi_create_pg(void)
-{
-    struct HYD_Proc_params *proc_params;
-    int num_procs;
-    HYD_Status status = HYD_SUCCESS;
-
-    HYDU_FUNC_ENTER();
-
-    /* Find the number of processes in the PG */
-    num_procs = 0;
-    proc_params = handle.proc_params;
-    while (proc_params) {
-        num_procs += proc_params->exec_proc_count;
-        proc_params = proc_params->next;
-    }
-
-    status = create_pg(&pg_list, 0);
-    HYDU_ERR_POP(status, "unable to create pg\n");
-    pg_list->num_procs = num_procs;
-
-  fn_exit:
-    HYDU_FUNC_EXIT();
-    return status;
-
-  fn_fail:
-    goto fn_exit;
-}
-
-
-HYD_Status HYD_PMCD_pmi_query_initack(int fd, char *args[])
-{
-    int id, size, debug, i;
-    char *ssize, *srank, *sdebug, *tmp[HYDU_NUM_JOIN_STR], *cmd;
-    struct HYD_Proc_params *proc_params;
-    HYD_PMCD_pmi_pg_t *run;
-    HYD_Status status = HYD_SUCCESS;
-
-    HYDU_FUNC_ENTER();
-
-    strtok(args[0], "=");
-    id = atoi(strtok(NULL, "="));
-
-    size = 0;
-    proc_params = handle.proc_params;
-    while (proc_params) {
-        size += proc_params->exec_proc_count;
-        proc_params = proc_params->next;
-    }
-    debug = handle.debug;
-
-    status = HYDU_int_to_str(size, &ssize);
-    HYDU_ERR_POP(status, "unable to convert int to string\n");
-
-    status = HYDU_int_to_str(id, &srank);
-    HYDU_ERR_POP(status, "unable to convert int to string\n");
-
-    status = HYDU_int_to_str(debug, &sdebug);
-    HYDU_ERR_POP(status, "unable to convert int to string\n");
-
-    i = 0;
-    tmp[i++] = "cmd=initack\ncmd=set size=";
-    tmp[i++] = ssize;
-    tmp[i++] = "\ncmd=set rank=";
-    tmp[i++] = srank;
-    tmp[i++] = "\ncmd=set debug=";
-    tmp[i++] = sdebug;
-    tmp[i++] = "\n";
-    tmp[i++] = NULL;
-
-    status = HYDU_str_alloc_and_join(tmp, &cmd);
-    HYDU_ERR_POP(status, "error while joining strings\n");
-
-    status = HYDU_sock_writeline(fd, cmd, strlen(cmd));
-    HYDU_ERR_POP(status, "error writing PMI line\n");
-
-    HYDU_FREE(ssize);
-    HYDU_FREE(srank);
-    HYDU_FREE(sdebug);
-    HYDU_FREE(cmd);
-
-    run = pg_list;
-    while (run->next)
-        run = run->next;
-
-    /* Add the process to the last PG */
-    status = add_process_to_pg(run, fd);
-    HYDU_ERR_POP(status, "unable to add process to pg\n");
-
-  fn_exit:
-    HYDU_FUNC_EXIT();
-    return status;
-
-  fn_fail:
-    goto fn_exit;
-}
-
-
-HYD_Status HYD_PMCD_pmi_query_init(int fd, char *args[])
-{
-    int pmi_version, pmi_subversion;
-    char *tmp[HYDU_NUM_JOIN_STR];
-    HYD_Status status = HYD_SUCCESS;
-
-    HYDU_FUNC_ENTER();
-
-    strtok(args[0], "=");
-    pmi_version = atoi(strtok(NULL, "="));
-    strtok(args[1], "=");
-    pmi_subversion = atoi(strtok(NULL, "="));
-
-    if (pmi_version == 1 && pmi_subversion <= 1) {
-        /* We support PMI v1.0 and 1.1 */
-        tmp[0] = "cmd=response_to_init pmi_version=1 pmi_subversion=1 rc=0\n";
-        status = HYDU_sock_writeline(fd, tmp[0], strlen(tmp[0]));
-        HYDU_ERR_POP(status, "error writing PMI line\n");
-    }
-    else {
-        /* PMI version mismatch */
-        HYDU_ERR_SETANDJUMP2(status, HYD_INTERNAL_ERROR,
-                             "PMI version mismatch; %d.%d\n", pmi_version, pmi_subversion);
-    }
-
-  fn_exit:
-    HYDU_FUNC_EXIT();
-    return status;
-
-  fn_fail:
-    goto fn_exit;
-}
-
-
-HYD_Status HYD_PMCD_pmi_query_get_maxes(int fd, char *args[])
-{
-    int i;
-    char *tmp[HYDU_NUM_JOIN_STR], *cmd;
-    char *maxkvsname, *maxkeylen, *maxvallen;
-    HYD_Status status = HYD_SUCCESS;
-
-    HYDU_FUNC_ENTER();
-
-    status = HYDU_int_to_str(MAXKVSNAME, &maxkvsname);
-    HYDU_ERR_POP(status, "unable to convert int to string\n");
-
-    status = HYDU_int_to_str(MAXKEYLEN, &maxkeylen);
-    HYDU_ERR_POP(status, "unable to convert int to string\n");
-
-    status = HYDU_int_to_str(MAXVALLEN, &maxvallen);
-    HYDU_ERR_POP(status, "unable to convert int to string\n");
-
-    i = 0;
-    tmp[i++] = "cmd=maxes kvsname_max=";
-    tmp[i++] = maxkvsname;
-    tmp[i++] = " keylen_max=";
-    tmp[i++] = maxkeylen;
-    tmp[i++] = " vallen_max=";
-    tmp[i++] = maxvallen;
-    tmp[i++] = "\n";
-    tmp[i++] = NULL;
-
-    status = HYDU_str_alloc_and_join(tmp, &cmd);
-    HYDU_ERR_POP(status, "unable to join strings\n");
-
-    status = HYDU_sock_writeline(fd, cmd, strlen(cmd));
-    HYDU_ERR_POP(status, "error writing PMI line\n");
-    HYDU_FREE(cmd);
-
-    HYDU_FREE(maxkvsname);
-    HYDU_FREE(maxkeylen);
-    HYDU_FREE(maxvallen);
-
-  fn_exit:
-    HYDU_FUNC_EXIT();
-    return status;
-
-  fn_fail:
-    goto fn_exit;
-}
-
-
-static HYD_PMCD_pmi_process_t *find_process(int fd)
-{
-    HYD_PMCD_pmi_pg_t *pg;
-    HYD_PMCD_pmi_process_t *process = NULL;
-
-    pg = pg_list;
-    while (pg) {
-        process = pg->process;
-        while (process) {
-            if (process->fd == fd)
-                break;
-            process = process->next;
-        }
-        pg = pg->next;
-    }
-
-    return process;
-}
-
-
-HYD_Status HYD_PMCD_pmi_query_get_appnum(int fd, char *args[])
-{
-    char *tmp[HYDU_NUM_JOIN_STR], *cmd;
-    char *sapp_num;
-    int i;
-    HYD_PMCD_pmi_process_t *process;
-    HYD_Status status = HYD_SUCCESS;
-
-    HYDU_FUNC_ENTER();
-
-    /* Find the group id corresponding to this fd */
-    process = find_process(fd);
-    if (process == NULL) /* We didn't find the process */
-        HYDU_ERR_SETANDJUMP(status, HYD_INTERNAL_ERROR,
-                            "unable to find process structure\n");
-
-    status = HYDU_int_to_str(process->pg->id, &sapp_num);
-    HYDU_ERR_POP(status, "unable to convert int to string\n");
-
-    i = 0;
-    tmp[i++] = "cmd=appnum appnum=";
-    tmp[i++] = sapp_num;
-    tmp[i++] = "\n";
-    tmp[i++] = NULL;
-
-    status = HYDU_str_alloc_and_join(tmp, &cmd);
-    HYDU_ERR_POP(status, "unable to join strings\n");
-
-    status = HYDU_sock_writeline(fd, cmd, strlen(cmd));
-    HYDU_ERR_POP(status, "error writing PMI line\n");
-    HYDU_FREE(cmd);
-
-    HYDU_FREE(sapp_num);
-
-  fn_exit:
-    HYDU_FUNC_EXIT();
-    return status;
-
-  fn_fail:
-    goto fn_exit;
-}
-
-
-HYD_Status HYD_PMCD_pmi_query_get_my_kvsname(int fd, char *args[])
-{
-    char *tmp[HYDU_NUM_JOIN_STR], *cmd;
-    int i;
-    HYD_PMCD_pmi_process_t *process;
-    HYD_Status status = HYD_SUCCESS;
-
-    HYDU_FUNC_ENTER();
-
-    /* Find the group id corresponding to this fd */
-    process = find_process(fd);
-    if (process == NULL) /* We didn't find the process */
-        HYDU_ERR_SETANDJUMP1(status, HYD_INTERNAL_ERROR,
-                             "unable to find process structure for fd %d\n", fd);
-
-    i = 0;
-    tmp[i++] = "cmd=my_kvsname kvsname=";
-    tmp[i++] = process->pg->kvs->kvs_name;
-    tmp[i++] = "\n";
-    tmp[i++] = NULL;
-
-    status = HYDU_str_alloc_and_join(tmp, &cmd);
-    HYDU_ERR_POP(status, "unable to join strings\n");
-
-    status = HYDU_sock_writeline(fd, cmd, strlen(cmd));
-    HYDU_ERR_POP(status, "error writing PMI line\n");
-    HYDU_FREE(cmd);
-
-  fn_exit:
-    HYDU_FUNC_EXIT();
-    return status;
-
-  fn_fail:
-    goto fn_exit;
-}
-
-
-HYD_Status HYD_PMCD_pmi_query_barrier_in(int fd, char *args[])
-{
-    HYD_PMCD_pmi_process_t *process, *run;
-    char *cmd;
-    HYD_Status status = HYD_SUCCESS;
-
-    HYDU_FUNC_ENTER();
-
-    /* Find the group id corresponding to this fd */
-    process = find_process(fd);
-    if (process == NULL) /* We didn't find the process */
-        HYDU_ERR_SETANDJUMP1(status, HYD_INTERNAL_ERROR,
-                             "unable to find process structure for fd %d\n", fd);
-
-    process->pg->barrier_count++;
-
-    /* All the processes have arrived at the barrier; send a
-     * barrier_out message to everyone. */
-    if (process->pg->barrier_count == process->pg->num_procs) {
-        cmd = "cmd=barrier_out\n";
-        run = process->pg->process;     /* The first process in the list */
-        while (run) {
-            status = HYDU_sock_writeline(run->fd, cmd, strlen(cmd));
-            HYDU_ERR_POP(status, "error writing PMI line\n");
-            run = run->next;
-        }
-
-        process->pg->barrier_count = 0;
-    }
-
-  fn_exit:
-    HYDU_FUNC_EXIT();
-    return status;
-
-  fn_fail:
-    goto fn_exit;
-}
-
-
-HYD_Status HYD_PMCD_pmi_query_put(int fd, char *args[])
-{
-    int i;
-    HYD_PMCD_pmi_process_t *process;
-    HYD_PMCD_pmi_kvs_pair_t *key_pair, *run;
-    char *kvsname, *key, *val, *key_pair_str = NULL;
-    char *tmp[HYDU_NUM_JOIN_STR], *cmd;
-    HYD_Status status = HYD_SUCCESS;
-
-    HYDU_FUNC_ENTER();
-
-    strtok(args[0], "=");
-    kvsname = strtok(NULL, "=");
-    strtok(args[1], "=");
-    key = strtok(NULL, "=");
-    strtok(args[2], "=");
-    val = strtok(NULL, "=");
-
-    /* Find the group id corresponding to this fd */
-    process = find_process(fd);
-    if (process == NULL) /* We didn't find the process */
-        HYDU_ERR_SETANDJUMP1(status, HYD_INTERNAL_ERROR,
-                             "unable to find process structure for fd %d\n", fd);
-
-    if (strcmp(process->pg->kvs->kvs_name, kvsname))
-        HYDU_ERR_SETANDJUMP2(status, HYD_INTERNAL_ERROR,
-                             "kvsname (%s) does not match this process' kvs space (%s)\n",
-                             kvsname, process->pg->kvs->kvs_name);
-
-    HYDU_MALLOC(key_pair, HYD_PMCD_pmi_kvs_pair_t *, sizeof(HYD_PMCD_pmi_kvs_pair_t), status);
-    MPIU_Snprintf(key_pair->key, MAXKEYLEN, "%s", key);
-    MPIU_Snprintf(key_pair->val, MAXVALLEN, "%s", val);
-    key_pair->next = NULL;
-
-    i = 0;
-    tmp[i++] = "cmd=put_result rc=";
-    if (process->pg->kvs->key_pair == NULL) {
-        process->pg->kvs->key_pair = key_pair;
-        tmp[i++] = "0 msg=success";
-    }
-    else {
-        run = process->pg->kvs->key_pair;
-        while (run->next) {
-            if (!strcmp(run->key, key_pair->key)) {
-                tmp[i++] = "-1 msg=duplicate_key";
-                key_pair_str = MPIU_Strdup(key_pair->key);
-                tmp[i++] = key_pair_str;
-                break;
-            }
-            run = run->next;
-        }
-        run->next = key_pair;
-        tmp[i++] = "0 msg=success";
-    }
-    tmp[i++] = "\n";
-    tmp[i++] = NULL;
-
-    status = HYDU_str_alloc_and_join(tmp, &cmd);
-    HYDU_ERR_POP(status, "unable to join strings\n");
-
-    status = HYDU_sock_writeline(fd, cmd, strlen(cmd));
-    HYDU_ERR_POP(status, "error writing PMI line\n");
-    HYDU_FREE(cmd);
-    HYDU_FREE(key_pair_str);
-
-  fn_exit:
-    HYDU_FUNC_EXIT();
-    return status;
-
-  fn_fail:
-    goto fn_exit;
-}
-
-
-HYD_Status HYD_PMCD_pmi_query_get(int fd, char *args[])
-{
-    int i;
-    HYD_PMCD_pmi_process_t *process;
-    HYD_PMCD_pmi_kvs_pair_t *run;
-    char *kvsname, *key;
-    char *tmp[HYDU_NUM_JOIN_STR], *cmd, *key_val_str = NULL;
-    HYD_Status status = HYD_SUCCESS;
-
-    HYDU_FUNC_ENTER();
-
-    strtok(args[0], "=");
-    kvsname = strtok(NULL, "=");
-    strtok(args[1], "=");
-    key = strtok(NULL, "=");
-
-    /* Find the group id corresponding to this fd */
-    process = find_process(fd);
-    if (process == NULL) /* We didn't find the process */
-        HYDU_ERR_SETANDJUMP1(status, HYD_INTERNAL_ERROR,
-                             "unable to find process structure for fd %d\n", fd);
-
-    if (strcmp(process->pg->kvs->kvs_name, kvsname))
-        HYDU_ERR_SETANDJUMP2(status, HYD_INTERNAL_ERROR,
-                             "kvsname (%s) does not match this process' kvs space (%s)\n",
-                             kvsname, process->pg->kvs->kvs_name);
-
-    i = 0;
-    tmp[i++] = "cmd=get_result rc=";
-    if (process->pg->kvs->key_pair == NULL) {
-        tmp[i++] = "-1 msg=key_";
-        tmp[i++] = key;
-        tmp[i++] = "_not_found value=unknown";
-    }
-    else {
-        run = process->pg->kvs->key_pair;
-        while (run) {
-            if (!strcmp(run->key, key)) {
-                tmp[i++] = "0 msg=success value=";
-                key_val_str = MPIU_Strdup(run->val);
-                tmp[i++] = key_val_str;
-                break;
-            }
-            run = run->next;
-        }
-        if (run == NULL) {
-            tmp[i++] = "-1 msg=key_";
-            tmp[i++] = key;
-            tmp[i++] = "_not_found value=unknown";
-        }
-    }
-    tmp[i++] = "\n";
-    tmp[i++] = NULL;
-
-    status = HYDU_str_alloc_and_join(tmp, &cmd);
-    HYDU_ERR_POP(status, "unable to join strings\n");
-
-    status = HYDU_sock_writeline(fd, cmd, strlen(cmd));
-    HYDU_ERR_POP(status, "error writing PMI line\n");
-    HYDU_FREE(cmd);
-    HYDU_FREE(key_val_str);
-
-  fn_exit:
-    HYDU_FUNC_EXIT();
-    return status;
-
-  fn_fail:
-    goto fn_exit;
-}
-
-
-HYD_Status HYD_PMCD_pmi_query_finalize(int fd, char *args[])
-{
-    char *cmd;
-    HYD_Status status = HYD_SUCCESS;
-
-    HYDU_FUNC_ENTER();
-
-    cmd = "cmd=finalize_ack\n";
-    status = HYDU_sock_writeline(fd, cmd, strlen(cmd));
-    HYDU_ERR_POP(status, "error writing PMI line\n");
-
-  fn_exit:
-    HYDU_FUNC_EXIT();
-    return status;
-
-  fn_fail:
-    goto fn_exit;
-}
-
-
-HYD_Status HYD_PMCD_pmi_query_get_usize(int fd, char *args[])
-{
-    int usize, i;
-    char *tmp[HYDU_NUM_JOIN_STR], *cmd, *usize_str;
-    HYD_Status status = HYD_SUCCESS;
-
-    HYDU_FUNC_ENTER();
-
-    status = HYD_BSCI_get_usize(&usize);
-    HYDU_ERR_POP(status, "unable to get bootstrap universe size\n");
-
-    status = HYDU_int_to_str(usize, &usize_str);
-    HYDU_ERR_POP(status, "unable to convert int to string\n");
-
-    i = 0;
-    tmp[i++] = "cmd=universe_size size=";
-    tmp[i++] = usize_str;
-    tmp[i++] = "\n";
-    tmp[i++] = NULL;
-
-    status = HYDU_str_alloc_and_join(tmp, &cmd);
-    HYDU_ERR_POP(status, "unable to join strings\n");
-
-    status = HYDU_sock_writeline(fd, cmd, strlen(cmd));
-    HYDU_ERR_POP(status, "error writing PMI line\n");
-    HYDU_FREE(cmd);
-
-  fn_exit:
-    HYDU_FUNC_EXIT();
-    return status;
-
-  fn_fail:
-    goto fn_exit;
-}
-
-
-static HYD_Status free_pmi_process_list(HYD_PMCD_pmi_process_t * process_list)
-{
-    HYD_PMCD_pmi_process_t *process, *tmp;
-    HYD_Status status = HYD_SUCCESS;
-
-    HYDU_FUNC_ENTER();
-
-    process = process_list;
-    while (process) {
-        tmp = process->next;
-        HYDU_FREE(process);
-        process = tmp;
-    }
-
-    HYDU_FUNC_EXIT();
-    return status;
-}
-
-
-static HYD_Status free_pmi_kvs_list(HYD_PMCD_pmi_kvs_t * kvs_list)
-{
-    HYD_PMCD_pmi_kvs_pair_t *key_pair, *tmp;
-    HYD_Status status = HYD_SUCCESS;
-
-    HYDU_FUNC_ENTER();
-
-    key_pair = kvs_list->key_pair;
-    while (key_pair) {
-        tmp = key_pair->next;
-        HYDU_FREE(key_pair);
-        key_pair = tmp;
-    }
-    HYDU_FREE(kvs_list);
-
-    HYDU_FUNC_EXIT();
-    return status;
-}
-
-
-HYD_Status HYD_PMCD_pmi_finalize(void)
-{
-    HYD_PMCD_pmi_pg_t *pg, *tmp;
-    HYD_Status status = HYD_SUCCESS;
-
-    HYDU_FUNC_ENTER();
-
-    pg = pg_list;
-    while (pg) {
-        tmp = pg->next;
-
-        status = free_pmi_process_list(pg->process);
-        HYDU_ERR_POP(status, "unable to free process list\n");
-
-        status = free_pmi_kvs_list(pg->kvs);
-        HYDU_ERR_POP(status, "unable to free kvs list\n");
-
-        HYDU_FREE(pg);
-        pg = tmp;
-    }
-
-  fn_exit:
-    HYDU_FUNC_EXIT();
-    return status;
-
-  fn_fail:
-    goto fn_exit;
-}

Deleted: mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_query.h
===================================================================
--- mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_query.h	2009-03-20 23:39:20 UTC (rev 4154)
+++ mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_query.h	2009-03-21 04:05:44 UTC (rev 4155)
@@ -1,67 +0,0 @@
-/* -*- Mode: C; c-basic-offset:4 ; -*- */
-/*
- *  (C) 2008 by Argonne National Laboratory.
- *      See COPYRIGHT in top-level directory.
- */
-
-#ifndef PMI_QUERY_H_INCLUDED
-#define PMI_QUERY_H_INCLUDED
-
-#include "hydra.h"
-#include "hydra_utils.h"
-
-#define MAXKEYLEN    64 /* max length of key in keyval space */
-#define MAXVALLEN   256 /* max length of value in keyval space */
-#define MAXNAMELEN  256 /* max length of various names */
-#define MAXKVSNAME  MAXNAMELEN  /* max length of a kvsname */
-
-typedef struct HYD_PMCD_pmi_kvs_pair {
-    char key[MAXKEYLEN];
-    char val[MAXVALLEN];
-    struct HYD_PMCD_pmi_kvs_pair *next;
-} HYD_PMCD_pmi_kvs_pair_t;
-
-typedef struct HYD_PMCD_pmi_kvs {
-    char kvs_name[MAXNAMELEN];  /* Name of this kvs */
-    HYD_PMCD_pmi_kvs_pair_t *key_pair;
-} HYD_PMCD_pmi_kvs_t;
-
-typedef struct HYD_PMCD_pmi_pg HYD_PMCD_pmi_pg_t;
-typedef struct HYD_PMCD_pmi_process HYD_PMCD_pmi_process_t;
-
-struct HYD_PMCD_pmi_process {
-    /* This is a bad design if we need to tie in an FD to a PMI
-     * process. This essentially kills any chance of PMI server
-     * masquerading. However, PMI v1 requires this state to be
-     * maintained. */
-    int fd;
-    struct HYD_PMCD_pmi_pg *pg;
-    struct HYD_PMCD_pmi_process *next;
-};
-
-struct HYD_PMCD_pmi_pg {
-    int id;
-
-    int num_procs;              /* Number of processes in the group */
-    int barrier_count;
-
-    struct HYD_PMCD_pmi_process *process;
-    HYD_PMCD_pmi_kvs_t *kvs;
-
-    struct HYD_PMCD_pmi_pg *next;
-};
-
-HYD_Status HYD_PMCD_pmi_create_pg(void);
-HYD_Status HYD_PMCD_pmi_query_initack(int fd, char *args[]);
-HYD_Status HYD_PMCD_pmi_query_init(int fd, char *args[]);
-HYD_Status HYD_PMCD_pmi_query_get_maxes(int fd, char *args[]);
-HYD_Status HYD_PMCD_pmi_query_get_appnum(int fd, char *args[]);
-HYD_Status HYD_PMCD_pmi_query_get_my_kvsname(int fd, char *args[]);
-HYD_Status HYD_PMCD_pmi_query_barrier_in(int fd, char *args[]);
-HYD_Status HYD_PMCD_pmi_query_put(int fd, char *args[]);
-HYD_Status HYD_PMCD_pmi_query_get(int fd, char *args[]);
-HYD_Status HYD_PMCD_pmi_query_finalize(int fd, char *args[]);
-HYD_Status HYD_PMCD_pmi_query_get_usize(int fd, char *args[]);
-HYD_Status HYD_PMCD_pmi_finalize(void);
-
-#endif /* PMI_QUERY_H_INCLUDED */

Modified: mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_serv_cb.c
===================================================================
--- mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_serv_cb.c	2009-03-20 23:39:20 UTC (rev 4154)
+++ mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_serv_cb.c	2009-03-21 04:05:44 UTC (rev 4155)
@@ -6,7 +6,8 @@
 
 #include "hydra.h"
 #include "hydra_utils.h"
-#include "pmi_query.h"
+#include "pmi_handle.h"
+#include "pmi_handle_v1.h"
 #include "pmci.h"
 #include "bsci.h"
 #include "demux.h"
@@ -14,6 +15,7 @@
 
 int HYD_PMCD_pmi_serv_listenfd;
 HYD_Handle handle;
+struct HYD_PMCD_pmi_handle *HYD_PMCD_pmi_handle_list;
 
 /*
  * HYD_PMCD_pmi_serv_cb: This is the core PMI server part of the
@@ -24,28 +26,13 @@
  *
  * 2. The client sends us a "cmd" or "mcmd" string which means that a
  * single or multi-line command is to follow.
- *
- * 3. Here are the commands that we respect:
- *     - initack [done]
- *     - init [done]
- *     - get_maxes [done]
- *     - get_appnum [done]
- *     - get_my_kvsname [done]
- *     - barrier_in [done]
- *     - put [done]
- *     - get [done]
- *     - finalize [done]
- *     - get_universe_size [done]
- *     - abort
- *     - create_kvs
- *     - destroy_kvs
- *     - getbyidx
- *     - spawn
  */
 HYD_Status HYD_PMCD_pmi_serv_cb(int fd, HYD_Event_t events)
 {
     int accept_fd, linelen, i;
     char *buf, *cmd, *args[HYD_EXEC_ARGS];
+    char *str1, *str2;
+    struct HYD_PMCD_pmi_handle *h;
     HYD_Status status = HYD_SUCCESS;
 
     HYDU_FUNC_ENTER();
@@ -99,55 +86,42 @@
         if (cmd == NULL) {
             status = HYD_SUCCESS;
         }
-        else if (!strcmp("cmd=initack", cmd)) {
-            status = HYD_PMCD_pmi_query_initack(fd, args);
-        }
         else if (!strcmp("cmd=init", cmd)) {
-            status = HYD_PMCD_pmi_query_init(fd, args);
+            /* Init is generic to all PMI implementations */
+            status = HYD_PMCD_pmi_init(fd, args);
         }
-        else if (!strcmp("cmd=get_maxes", cmd)) {
-            status = HYD_PMCD_pmi_query_get_maxes(fd, args);
-        }
-        else if (!strcmp("cmd=get_appnum", cmd)) {
-            status = HYD_PMCD_pmi_query_get_appnum(fd, args);
-        }
-        else if (!strcmp("cmd=get_my_kvsname", cmd)) {
-            status = HYD_PMCD_pmi_query_get_my_kvsname(fd, args);
-        }
-        else if (!strcmp("cmd=barrier_in", cmd)) {
-            status = HYD_PMCD_pmi_query_barrier_in(fd, args);
-        }
-        else if (!strcmp("cmd=put", cmd)) {
-            status = HYD_PMCD_pmi_query_put(fd, args);
-        }
-        else if (!strcmp("cmd=get", cmd)) {
-            status = HYD_PMCD_pmi_query_get(fd, args);
-        }
-        else if (!strcmp("cmd=finalize", cmd)) {
-            status = HYD_PMCD_pmi_query_finalize(fd, args);
+        else {
+            /* Search for the PMI command in our table */
+            status = HYDU_strsplit(cmd, &str1, &str2, '=');
+            HYDU_ERR_POP(status, "string split returned error\n");
 
-            if (status == HYD_SUCCESS) {
-                status = HYD_DMX_deregister_fd(fd);
-                HYDU_ERR_POP(status, "unable to register fd\n");
-                close(fd);
+            /* If we did not get an init, fall back to PMI-v1 */
+            /* FIXME: This part of the code should not know anything
+             * about PMI-1 vs. PMI-2. */
+            if (!HYD_PMCD_pmi_handle_list)
+                HYD_PMCD_pmi_handle_list = HYD_PMCD_pmi_v1;
+
+            h = HYD_PMCD_pmi_handle_list;
+            while (h->handler) {
+                if (!strcmp(str2, h->cmd)) {
+                    status = h->handler(fd, args);
+                    HYDU_ERR_POP(status, "PMI handler returned error\n");
+                    break;
+                }
+                h++;
             }
-        }
-        else if (!strcmp("cmd=get_universe_size", cmd)) {
-            status = HYD_PMCD_pmi_query_get_usize(fd, args);
-        }
-        else {
-            /* We don't understand the command */
-            HYDU_Error_printf("Unrecognized PMI command: %s; cleaning up processes\n", cmd);
+            if (!h->handler) {
+                /* We don't understand the command */
+                HYDU_Error_printf("Unrecognized PMI command: %s; cleaning up processes\n",
+                                  cmd);
 
-            /* Cleanup all the processes and return. We don't need to
-             * check the return status since we are anyway returning
-             * an error */
-            HYD_PMCD_pmi_serv_cleanup();
-            status = HYD_SUCCESS;
-            goto fn_fail;
+                /* Cleanup all the processes and return. We don't need
+                 * to check the return status since we are anyway
+                 * returning an error */
+                HYD_PMCD_pmi_serv_cleanup();
+                HYDU_ERR_SETANDJUMP(status, HYD_SUCCESS, "");
+            }
         }
-
-        HYDU_ERR_POP(status, "PMI server returned error\n");
     }
 
   fn_exit:

Modified: mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_serv_finalize.c
===================================================================
--- mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_serv_finalize.c	2009-03-20 23:39:20 UTC (rev 4154)
+++ mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_serv_finalize.c	2009-03-21 04:05:44 UTC (rev 4155)
@@ -6,7 +6,7 @@
 
 #include "hydra.h"
 #include "pmci.h"
-#include "pmi_query.h"
+#include "pmi_handle.h"
 #include "bsci.h"
 #include "demux.h"
 #include "pmi_serv.h"

Modified: mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_serv_launch.c
===================================================================
--- mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_serv_launch.c	2009-03-20 23:39:20 UTC (rev 4154)
+++ mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_serv_launch.c	2009-03-21 04:05:44 UTC (rev 4155)
@@ -7,7 +7,7 @@
 #include "hydra.h"
 #include "hydra_utils.h"
 #include "pmci.h"
-#include "pmi_query.h"
+#include "pmi_handle.h"
 #include "bsci.h"
 #include "demux.h"
 #include "pmi_serv.h"



More information about the mpich2-commits mailing list