[mpich2-commits] r7692 - in mpich2/trunk/src/pm/hydra: pm/pmiserv tools/bootstrap/external tools/bootstrap/include tools/bootstrap/persist tools/bootstrap/src tools/bootstrap/utils tools/demux ui/mpich

balaji at mcs.anl.gov balaji at mcs.anl.gov
Wed Jan 12 03:09:20 CST 2011


Author: balaji
Date: 2011-01-12 03:09:20 -0600 (Wed, 12 Jan 2011)
New Revision: 7692

Modified:
   mpich2/trunk/src/pm/hydra/pm/pmiserv/common.h
   mpich2/trunk/src/pm/hydra/pm/pmiserv/pmip.c
   mpich2/trunk/src/pm/hydra/pm/pmiserv/pmip.h
   mpich2/trunk/src/pm/hydra/pm/pmiserv/pmip_cb.c
   mpich2/trunk/src/pm/hydra/pm/pmiserv/pmip_utils.c
   mpich2/trunk/src/pm/hydra/pm/pmiserv/pmiserv_cb.c
   mpich2/trunk/src/pm/hydra/pm/pmiserv/pmiserv_pmci.c
   mpich2/trunk/src/pm/hydra/pm/pmiserv/pmiserv_pmi_v1.c
   mpich2/trunk/src/pm/hydra/pm/pmiserv/pmiserv_pmi_v2.c
   mpich2/trunk/src/pm/hydra/pm/pmiserv/pmiserv_utils.c
   mpich2/trunk/src/pm/hydra/tools/bootstrap/external/external.h
   mpich2/trunk/src/pm/hydra/tools/bootstrap/external/external_launch.c
   mpich2/trunk/src/pm/hydra/tools/bootstrap/external/ll.h
   mpich2/trunk/src/pm/hydra/tools/bootstrap/external/ll_launch.c
   mpich2/trunk/src/pm/hydra/tools/bootstrap/external/slurm.h
   mpich2/trunk/src/pm/hydra/tools/bootstrap/external/slurm_launch.c
   mpich2/trunk/src/pm/hydra/tools/bootstrap/include/bsci.h.in
   mpich2/trunk/src/pm/hydra/tools/bootstrap/persist/persist_client.h
   mpich2/trunk/src/pm/hydra/tools/bootstrap/persist/persist_launch.c
   mpich2/trunk/src/pm/hydra/tools/bootstrap/persist/persist_server.c
   mpich2/trunk/src/pm/hydra/tools/bootstrap/src/bsci_launch.c
   mpich2/trunk/src/pm/hydra/tools/bootstrap/utils/bscu_cb.c
   mpich2/trunk/src/pm/hydra/tools/demux/demux.c
   mpich2/trunk/src/pm/hydra/tools/demux/demux_internal.h
   mpich2/trunk/src/pm/hydra/tools/demux/demux_poll.c
   mpich2/trunk/src/pm/hydra/tools/demux/demux_select.c
   mpich2/trunk/src/pm/hydra/ui/mpich/mpiexec.c
Log:
Now STDIN is completely handled through the proxy's control
socket. This makes STDIN management independent of which bootstrap
server we use. This provides the necessary setup to enable ticket

Modified: mpich2/trunk/src/pm/hydra/pm/pmiserv/common.h
===================================================================
--- mpich2/trunk/src/pm/hydra/pm/pmiserv/common.h	2011-01-12 09:08:49 UTC (rev 7691)
+++ mpich2/trunk/src/pm/hydra/pm/pmiserv/common.h	2011-01-12 09:09:20 UTC (rev 7692)
@@ -37,6 +37,7 @@
         CKPOINT,
         PMI_RESPONSE,
         SIGNAL_PROCESSES,
+        STDIN,
 
         /* Proxy to UI commands */
         PID_LIST,

Modified: mpich2/trunk/src/pm/hydra/pm/pmiserv/pmip.c
===================================================================
--- mpich2/trunk/src/pm/hydra/pm/pmiserv/pmip.c	2011-01-12 09:08:49 UTC (rev 7691)
+++ mpich2/trunk/src/pm/hydra/pm/pmiserv/pmip.c	2011-01-12 09:09:20 UTC (rev 7692)
@@ -19,7 +19,6 @@
 
     HYDU_init_user_global(&HYD_pmcd_pmip.user_global);
 
-    HYD_pmcd_pmip.system_global.enable_stdin = -1;
     HYD_pmcd_pmip.system_global.global_core_count = -1;
     HYD_pmcd_pmip.system_global.global_process_count = -1;
     HYD_pmcd_pmip.system_global.pmi_port = NULL;

Modified: mpich2/trunk/src/pm/hydra/pm/pmiserv/pmip.h
===================================================================
--- mpich2/trunk/src/pm/hydra/pm/pmiserv/pmip.h	2011-01-12 09:08:49 UTC (rev 7691)
+++ mpich2/trunk/src/pm/hydra/pm/pmiserv/pmip.h	2011-01-12 09:09:20 UTC (rev 7692)
@@ -14,7 +14,6 @@
     struct HYD_user_global user_global;
 
     struct {
-        int enable_stdin;
         int global_core_count;
         int global_process_count;
 

Modified: mpich2/trunk/src/pm/hydra/pm/pmiserv/pmip_cb.c
===================================================================
--- mpich2/trunk/src/pm/hydra/pm/pmiserv/pmip_cb.c	2011-01-12 09:08:49 UTC (rev 7691)
+++ mpich2/trunk/src/pm/hydra/pm/pmiserv/pmip_cb.c	2011-01-12 09:09:20 UTC (rev 7692)
@@ -30,23 +30,6 @@
 
     stdfd = (int) (size_t) userp;
 
-    if (stdfd == STDIN_FILENO) {
-        status = HYDU_sock_forward_stdio(stdfd, HYD_pmcd_pmip.downstream.in, &closed);
-        HYDU_ERR_POP(status, "stdin forwarding error\n");
-
-        if (closed) {
-            status = HYDT_dmx_deregister_fd(fd);
-            HYDU_ERR_POP(status, "unable to deregister fd\n");
-
-            close(fd);
-
-            close(HYD_pmcd_pmip.downstream.in);
-            HYD_pmcd_pmip.downstream.in = HYD_FD_CLOSED;
-        }
-
-        goto fn_exit;
-    }
-
     status = HYDU_sock_read(fd, buf, HYD_TMPBUF_SIZE, &recvd, &closed, 0);
     HYDU_ERR_POP(status, "sock read error\n");
 
@@ -442,7 +425,7 @@
 
 static HYD_status launch_procs(void)
 {
-    int i, j, arg, stdin_fd, process_id, pmi_rank;
+    int i, j, arg, process_id, pmi_rank;
     char *str, *envstr, *list, *pmi_port;
     char *client_args[HYD_NUM_TMP_STRINGS];
     struct HYD_env *env, *force_env = NULL;
@@ -522,7 +505,7 @@
         status = HYDU_env_create(&env, "PMI_PORT", pmi_port);
         HYDU_ERR_POP(status, "unable to create env\n");
 
-        /* Restart the proxy.  Specify stdin fd only if pmi_rank 0 is in this proxy. */
+        /* Restart the proxy */
         MPL_snprintf(ftb_event_payload, HYDT_FTB_MAX_PAYLOAD_DATA, "pgid:%d ranks:%d-%d",
                      HYD_pmcd_pmip.local.pgid, HYD_pmcd_pmip.downstream.pmi_rank[0],
                      HYD_pmcd_pmip.downstream.pmi_rank
@@ -530,9 +513,7 @@
         status = HYDT_ckpoint_restart(HYD_pmcd_pmip.local.pgid, HYD_pmcd_pmip.local.id,
                                       env, HYD_pmcd_pmip.local.proxy_process_count,
                                       pmi_ranks,
-                                      pmi_ranks[0] ? NULL :
-                                      HYD_pmcd_pmip.system_global.enable_stdin ?
-                                      &HYD_pmcd_pmip.downstream.in : NULL,
+                                      pmi_ranks[0] ? NULL : &HYD_pmcd_pmip.downstream.in,
                                       HYD_pmcd_pmip.downstream.out,
                                       HYD_pmcd_pmip.downstream.err,
                                       HYD_pmcd_pmip.downstream.pid);
@@ -695,32 +676,14 @@
             client_args[arg++] = NULL;
 
             HYDT_bind_pid_to_cpuset(process_id, &cpuset);
-            if (pmi_rank == 0) {
-                status = HYDU_create_process(client_args, force_env,
-                                             HYD_pmcd_pmip.system_global.enable_stdin ?
-                                             &HYD_pmcd_pmip.downstream.in : NULL,
-                                             &HYD_pmcd_pmip.downstream.out[process_id],
-                                             &HYD_pmcd_pmip.downstream.err[process_id],
-                                             &HYD_pmcd_pmip.downstream.pid[process_id],
-                                             cpuset);
-                HYDU_ERR_POP(status, "create process returned error\n");
+            status = HYDU_create_process(client_args, force_env,
+                                         pmi_rank ? NULL : &HYD_pmcd_pmip.downstream.in,
+                                         &HYD_pmcd_pmip.downstream.out[process_id],
+                                         &HYD_pmcd_pmip.downstream.err[process_id],
+                                         &HYD_pmcd_pmip.downstream.pid[process_id],
+                                         cpuset);
+            HYDU_ERR_POP(status, "create process returned error\n");
 
-                if (HYD_pmcd_pmip.system_global.enable_stdin) {
-                    stdin_fd = STDIN_FILENO;
-                    status = HYDT_dmx_register_fd(1, &stdin_fd, HYD_POLLIN,
-                                                  (void *) (size_t) STDIN_FILENO, stdio_cb);
-                    HYDU_ERR_POP(status, "unable to register fd\n");
-                }
-            }
-            else {
-                status = HYDU_create_process(client_args, force_env, NULL,
-                                             &HYD_pmcd_pmip.downstream.out[process_id],
-                                             &HYD_pmcd_pmip.downstream.err[process_id],
-                                             &HYD_pmcd_pmip.downstream.pid[process_id],
-                                             cpuset);
-                HYDU_ERR_POP(status, "create process returned error\n");
-            }
-
             HYDU_free_strlist(client_args);
 
             if (pmi_fds[1] != HYD_FD_UNSET) {
@@ -878,6 +841,7 @@
     int cmd_len, closed, i;
     struct HYD_pmcd_hdr hdr;
     char ftb_event_payload[HYDT_FTB_MAX_PAYLOAD_DATA];
+    char *buf;
     HYD_status status = HYD_SUCCESS;
 
     HYDU_FUNC_ENTER();
@@ -922,6 +886,29 @@
             if (HYD_pmcd_pmip.downstream.pid[i] != -1)
                 kill(HYD_pmcd_pmip.downstream.pid[i], SIGUSR1);
     }
+    else if (hdr.cmd == STDIN) {
+        int count;
+
+        if (hdr.buflen) {
+            HYDU_MALLOC(buf, char *, hdr.buflen, status);
+            HYDU_ERR_POP(status, "unable to allocate memory\n");
+
+            status = HYDU_sock_read(fd, buf, hdr.buflen, &count, &closed,
+                                    HYDU_SOCK_COMM_MSGWAIT);
+            HYDU_ERR_POP(status, "unable to read from control socket\n");
+            HYDU_ASSERT(!closed, status);
+
+            status = HYDU_sock_write(HYD_pmcd_pmip.downstream.in, buf, hdr.buflen, &count,
+                                     &closed);
+            HYDU_ERR_POP(status, "unable to write to downstream stdin\n");
+            HYDU_ASSERT(!closed, status);
+
+            HYDU_FREE(buf);
+        }
+        else {
+            close(HYD_pmcd_pmip.downstream.in);
+        }
+    }
     else {
         status = HYD_INTERNAL_ERROR;
     }

Modified: mpich2/trunk/src/pm/hydra/pm/pmiserv/pmip_utils.c
===================================================================
--- mpich2/trunk/src/pm/hydra/pm/pmiserv/pmip_utils.c	2011-01-12 09:08:49 UTC (rev 7691)
+++ mpich2/trunk/src/pm/hydra/pm/pmiserv/pmip_utils.c	2011-01-12 09:09:20 UTC (rev 7692)
@@ -93,11 +93,6 @@
     return HYDU_set_str_and_incr(arg, argv, &HYD_pmcd_pmip.user_global.iface);
 }
 
-static HYD_status enable_stdin_fn(char *arg, char ***argv)
-{
-    return HYDU_set_int_and_incr(arg, argv, &HYD_pmcd_pmip.system_global.enable_stdin);
-}
-
 static HYD_status auto_cleanup_fn(char *arg, char ***argv)
 {
     return HYDU_set_int_and_incr(arg, argv, &HYD_pmcd_pmip.user_global.auto_cleanup);
@@ -393,7 +388,6 @@
     {"launcher-exec", launcher_exec_fn, NULL},
     {"demux", demux_fn, NULL},
     {"iface", iface_fn, NULL},
-    {"enable-stdin", enable_stdin_fn, NULL},
     {"auto-cleanup", auto_cleanup_fn, NULL},
 
     /* Executable parameters */

Modified: mpich2/trunk/src/pm/hydra/pm/pmiserv/pmiserv_cb.c
===================================================================
--- mpich2/trunk/src/pm/hydra/pm/pmiserv/pmiserv_cb.c	2011-01-12 09:08:49 UTC (rev 7691)
+++ mpich2/trunk/src/pm/hydra/pm/pmiserv/pmiserv_cb.c	2011-01-12 09:09:20 UTC (rev 7692)
@@ -139,11 +139,16 @@
 
     proxy = (struct HYD_proxy *) userp;
 
-    status = HYDU_sock_read(fd, &hdr, sizeof(hdr), &count, &closed, HYDU_SOCK_COMM_MSGWAIT);
-    HYDU_ERR_POP(status, "unable to read command from proxy\n");
-    HYDU_ASSERT(!closed, status)
+    if (fd == STDIN_FILENO) {
+        hdr.cmd = STDIN;
+    }
+    else {
+        status = HYDU_sock_read(fd, &hdr, sizeof(hdr), &count, &closed, HYDU_SOCK_COMM_MSGWAIT);
+        HYDU_ERR_POP(status, "unable to read command from proxy\n");
+        HYDU_ASSERT(!closed, status);
+    }
 
-        if (hdr.cmd == PID_LIST) {      /* Got PIDs */
+    if (hdr.cmd == PID_LIST) {      /* Got PIDs */
         HYDU_MALLOC(proxy->pid, int *, proxy->proxy_process_count * sizeof(int), status);
         status = HYDU_sock_read(fd, (void *) proxy->pid,
                                 proxy->proxy_process_count * sizeof(int),
@@ -222,6 +227,31 @@
 
         HYDU_FREE(buf);
     }
+    else if (hdr.cmd == STDIN) {
+        HYDU_MALLOC(buf, char *, HYD_TMPBUF_SIZE, status);
+        HYDU_ERR_POP(status, "unable to allocate memory\n");
+
+        HYDU_sock_read(STDIN_FILENO, buf, HYD_TMPBUF_SIZE, &count, &closed, 0);
+        HYDU_ERR_POP(status, "error reading from stdin\n");
+
+        hdr.buflen = count;
+
+        HYDU_sock_write(proxy->control_fd, &hdr, sizeof(hdr), &count, &closed);
+        HYDU_ERR_POP(status, "error writing to control socket\n");
+        HYDU_ASSERT(!closed, status);
+
+        if (hdr.buflen) {
+            HYDU_sock_write(proxy->control_fd, buf, hdr.buflen, &count, &closed);
+            HYDU_ERR_POP(status, "error writing to control socket\n");
+            HYDU_ASSERT(!closed, status);
+
+            HYDU_FREE(buf);
+        }
+        else {
+            status = HYDT_dmx_deregister_fd(STDIN_FILENO);
+            HYDU_ERR_POP(status, "unable to deregister STDIN\n");
+        }
+    }
     else if (hdr.cmd == PROCESS_TERMINATED) {
         if (HYD_server_info.user_global.auto_cleanup == 0) {
             /* Update the map of the alive processes */
@@ -441,6 +471,40 @@
     status = HYDT_dmx_register_fd(1, &fd, HYD_POLLIN, proxy, control_cb);
     HYDU_ERR_POP(status, "unable to register fd\n");
 
+    if (pgid == 0 && proxy->proxy_id == 0) {
+        int fd_stdin = STDIN_FILENO;
+        int stdin_valid;
+        struct HYD_pmcd_hdr hdr;
+
+        /* FIXME: The below stdin_valid check is somehow interfering
+         * in the case where the application is run in the background,
+         * but expects some STDIN. The correct behavior is to close
+         * the STDIN socket for the application in that case. However,
+         * mpiexec seems to hang. I'm still investigating this
+         * case. In the meanwhile, I have commented out the stdin
+         * validity check. PLEASE DO NOT DELETE. All other cases
+         * dealing with STDIN seem to be working correctly. */
+#if 0
+        status = HYDT_dmx_stdin_valid(&stdin_valid);
+        HYDU_ERR_POP(status, "unable to check if stdin is valid\n");
+#else
+        stdin_valid = 1;
+#endif
+
+        if (!stdin_valid) {
+            hdr.cmd = STDIN;
+            hdr.buflen = 0;
+
+            HYDU_sock_write(proxy->control_fd, &hdr, sizeof(hdr), &count, &closed);
+            HYDU_ERR_POP(status, "error writing to control socket\n");
+            HYDU_ASSERT(!closed, status);
+        }
+        else {
+            status = HYDT_dmx_register_fd(1, &fd_stdin, HYD_POLLIN, proxy, control_cb);
+            HYDU_ERR_POP(status, "unable to register fd\n");
+        }
+    }
+
   fn_exit:
     HYDU_FUNC_EXIT();
     return status;

Modified: mpich2/trunk/src/pm/hydra/pm/pmiserv/pmiserv_pmci.c
===================================================================
--- mpich2/trunk/src/pm/hydra/pm/pmiserv/pmiserv_pmci.c	2011-01-12 09:08:49 UTC (rev 7691)
+++ mpich2/trunk/src/pm/hydra/pm/pmiserv/pmiserv_pmci.c	2011-01-12 09:09:20 UTC (rev 7692)
@@ -101,7 +101,7 @@
     struct HYD_proxy *proxy;
     struct HYD_node *node_list = NULL, *node, *tnode;
     char *proxy_args[HYD_NUM_TMP_STRINGS] = { NULL }, *control_port = NULL;
-    int enable_stdin, node_count, i, *control_fd;
+    int node_count, i, *control_fd;
     HYD_status status = HYD_SUCCESS;
 
     HYDU_FUNC_ENTER();
@@ -148,9 +148,6 @@
     status = HYD_pmcd_pmi_fill_in_exec_launch_info(&HYD_server_info.pg_list);
     HYDU_ERR_POP(status, "unable to fill in executable arguments\n");
 
-    status = HYDT_dmx_stdin_valid(&enable_stdin);
-    HYDU_ERR_POP(status, "unable to check if stdin is valid\n");
-
     HYDU_MALLOC(control_fd, int *, node_count * sizeof(int), status);
     for (i = 0; i < node_count; i++)
         control_fd[i] = HYD_FD_UNSET;
@@ -160,7 +157,7 @@
                        HYD_server_info.user_global.bindlib);
     HYDU_ERR_POP(status, "unable to initializing binding library");
 
-    status = HYDT_bsci_launch_procs(proxy_args, node_list, control_fd, enable_stdin);
+    status = HYDT_bsci_launch_procs(proxy_args, node_list, control_fd);
     HYDU_ERR_POP(status, "launcher cannot launch processes\n");
 
     for (i = 0, proxy = HYD_server_info.pg_list.proxy_list; proxy; proxy = proxy->next, i++)

Modified: mpich2/trunk/src/pm/hydra/pm/pmiserv/pmiserv_pmi_v1.c
===================================================================
--- mpich2/trunk/src/pm/hydra/pm/pmiserv/pmiserv_pmi_v1.c	2011-01-12 09:08:49 UTC (rev 7691)
+++ mpich2/trunk/src/pm/hydra/pm/pmiserv/pmiserv_pmi_v1.c	2011-01-12 09:09:20 UTC (rev 7692)
@@ -551,7 +551,7 @@
     status = HYD_pmcd_pmi_fill_in_exec_launch_info(pg);
     HYDU_ERR_POP(status, "unable to fill in executable arguments\n");
 
-    status = HYDT_bsci_launch_procs(proxy_args, node_list, NULL, 0);
+    status = HYDT_bsci_launch_procs(proxy_args, node_list, NULL);
     HYDU_ERR_POP(status, "launcher cannot launch processes\n");
     HYDU_free_node_list(node_list);
 

Modified: mpich2/trunk/src/pm/hydra/pm/pmiserv/pmiserv_pmi_v2.c
===================================================================
--- mpich2/trunk/src/pm/hydra/pm/pmiserv/pmiserv_pmi_v2.c	2011-01-12 09:08:49 UTC (rev 7691)
+++ mpich2/trunk/src/pm/hydra/pm/pmiserv/pmiserv_pmi_v2.c	2011-01-12 09:09:20 UTC (rev 7692)
@@ -732,7 +732,7 @@
     status = HYD_pmcd_pmi_fill_in_exec_launch_info(pg);
     HYDU_ERR_POP(status, "unable to fill in executable arguments\n");
 
-    status = HYDT_bsci_launch_procs(proxy_args, node_list, NULL, 0);
+    status = HYDT_bsci_launch_procs(proxy_args, node_list, NULL);
     HYDU_ERR_POP(status, "launcher cannot launch processes\n");
     HYDU_free_node_list(node_list);
 

Modified: mpich2/trunk/src/pm/hydra/pm/pmiserv/pmiserv_utils.c
===================================================================
--- mpich2/trunk/src/pm/hydra/pm/pmiserv/pmiserv_utils.c	2011-01-12 09:08:49 UTC (rev 7691)
+++ mpich2/trunk/src/pm/hydra/pm/pmiserv/pmiserv_utils.c	2011-01-12 09:09:20 UTC (rev 7692)
@@ -12,7 +12,7 @@
 
 HYD_status HYD_pmcd_pmi_fill_in_proxy_args(char **proxy_args, char *control_port, int pgid)
 {
-    int i, arg, use_ddd, use_valgrind, use_strace, enable_stdin;
+    int i, arg, use_ddd, use_valgrind, use_strace;
     char *path_str[HYD_NUM_TMP_STRINGS];
     HYD_status status = HYD_SUCCESS;
 
@@ -85,17 +85,6 @@
     proxy_args[arg++] = HYDU_strdup("--pgid");
     proxy_args[arg++] = HYDU_int_to_str(pgid);
 
-    if (pgid == 0) {
-        status = HYDT_dmx_stdin_valid(&enable_stdin);
-        HYDU_ERR_POP(status, "unable to check if stdin is valid\n");
-    }
-    else {
-        enable_stdin = 0;
-    }
-
-    proxy_args[arg++] = HYDU_strdup("--enable-stdin");
-    proxy_args[arg++] = HYDU_int_to_str(enable_stdin);
-
     proxy_args[arg++] = HYDU_strdup("--proxy-id");
     proxy_args[arg++] = NULL;
 

Modified: mpich2/trunk/src/pm/hydra/tools/bootstrap/external/external.h
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bootstrap/external/external.h	2011-01-12 09:08:49 UTC (rev 7691)
+++ mpich2/trunk/src/pm/hydra/tools/bootstrap/external/external.h	2011-01-12 09:09:20 UTC (rev 7692)
@@ -15,7 +15,7 @@
 #include "pbs.h"
 
 HYD_status HYDT_bscd_external_launch_procs(char **args, struct HYD_node *node_list,
-                                           int *control_fd, int enable_stdin);
+                                           int *control_fd);
 HYD_status HYDT_bscd_external_launcher_finalize(void);
 HYD_status HYDT_bscd_external_query_env_inherit(const char *env_name, int *ret);
 HYD_status HYDT_bscd_external_query_native_int(int *ret);

Modified: mpich2/trunk/src/pm/hydra/tools/bootstrap/external/external_launch.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bootstrap/external/external_launch.c	2011-01-12 09:08:49 UTC (rev 7691)
+++ mpich2/trunk/src/pm/hydra/tools/bootstrap/external/external_launch.c	2011-01-12 09:09:20 UTC (rev 7692)
@@ -10,10 +10,10 @@
 #include "bind.h"
 #include "external.h"
 
-static int fd_stdin, fd_stdout, fd_stderr;
+static int fd_stdout, fd_stderr;
 
 HYD_status HYDT_bscd_external_launch_procs(char **args, struct HYD_node *node_list,
-                                           int *control_fd, int enable_stdin)
+                                           int *control_fd)
 {
     int num_hosts, idx, i, host_idx, fd, exec_idx, offset, lh;
     int *pid, *fd_list, *dummy;
@@ -207,13 +207,10 @@
             HYDU_print_strlist(targs + offset);
         }
 
-        /* The stdin pointer will be some value for process_id 0; for
-         * everyone else, it's a dummy value. We don't just pass it
+        /* The stdin pointer is a dummy value. We don't just pass it
          * NULL, as older versions of ssh seem to freak out when no
          * stdin socket is provided. */
-        status = HYDU_create_process(targs + offset, env,
-                                     ((i == 0 && enable_stdin) ? &fd_stdin : dummy),
-                                     &fd_stdout, &fd_stderr,
+        status = HYDU_create_process(targs + offset, env, dummy, &fd_stdout, &fd_stderr,
                                      &HYD_bscu_pid_list[HYD_bscu_pid_count++], cpuset);
         HYDU_ERR_POP(status, "create process returned error\n");
 
@@ -223,18 +220,9 @@
             env = NULL;
         }
 
-        /* We don't wait for stdin to close */
         HYD_bscu_fd_list[HYD_bscu_fd_count++] = fd_stdout;
         HYD_bscu_fd_list[HYD_bscu_fd_count++] = fd_stderr;
 
-        /* Register stdio callbacks for the spawned process */
-        if (i == 0 && enable_stdin) {
-            fd = STDIN_FILENO;
-            status = HYDT_dmx_register_fd(1, &fd, HYD_POLLIN,
-                                          (void *) (size_t) fd_stdin, HYDT_bscu_stdio_cb);
-            HYDU_ERR_POP(status, "demux returned error registering fd\n");
-        }
-
         status = HYDT_dmx_register_fd(1, &fd_stdout, HYD_POLLIN,
                                       (void *) (size_t) STDOUT_FILENO, HYDT_bscu_stdio_cb);
         HYDU_ERR_POP(status, "demux returned error registering fd\n");

Modified: mpich2/trunk/src/pm/hydra/tools/bootstrap/external/ll.h
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bootstrap/external/ll.h	2011-01-12 09:08:49 UTC (rev 7691)
+++ mpich2/trunk/src/pm/hydra/tools/bootstrap/external/ll.h	2011-01-12 09:09:20 UTC (rev 7692)
@@ -10,7 +10,7 @@
 #include "hydra.h"
 
 HYD_status HYDT_bscd_ll_launch_procs(char **args, struct HYD_node *node_list,
-                                     int *control_fd, int enable_stdin);
+                                     int *control_fd);
 HYD_status HYDT_bscd_ll_query_proxy_id(int *proxy_id);
 HYD_status HYDT_bscd_ll_query_node_list(struct HYD_node **node_list);
 HYD_status HYDTI_bscd_ll_query_node_count(int *count);

Modified: mpich2/trunk/src/pm/hydra/tools/bootstrap/external/ll_launch.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bootstrap/external/ll_launch.c	2011-01-12 09:08:49 UTC (rev 7691)
+++ mpich2/trunk/src/pm/hydra/tools/bootstrap/external/ll_launch.c	2011-01-12 09:09:20 UTC (rev 7692)
@@ -10,12 +10,12 @@
 #include "bind.h"
 #include "ll.h"
 
-static int fd_stdin, fd_stdout, fd_stderr;
+static int fd_stdout, fd_stderr;
 
 HYD_status HYDT_bscd_ll_launch_procs(char **args, struct HYD_node *node_list,
-                                     int *control_fd, int enable_stdin)
+                                     int *control_fd)
 {
-    int idx, i, fd, total_procs, node_count;
+    int idx, i, total_procs, node_count;
     int *pid, *fd_list;
     char *targs[HYD_NUM_TMP_STRINGS], *node_list_str = NULL;
     char *path = NULL, *extra_arg_list = NULL, *extra_arg;
@@ -88,23 +88,13 @@
     targs[idx++] = NULL;
 
     HYDT_bind_cpuset_zero(&cpuset);
-    status = HYDU_create_process(targs, NULL,
-                                 enable_stdin ? &fd_stdin : NULL, &fd_stdout,
-                                 &fd_stderr, &HYD_bscu_pid_list[HYD_bscu_pid_count++], cpuset);
+    status = HYDU_create_process(targs, NULL, NULL, &fd_stdout, &fd_stderr,
+                                 &HYD_bscu_pid_list[HYD_bscu_pid_count++], cpuset);
     HYDU_ERR_POP(status, "create process returned error\n");
 
-    /* We don't wait for stdin to close */
     HYD_bscu_fd_list[HYD_bscu_fd_count++] = fd_stdout;
     HYD_bscu_fd_list[HYD_bscu_fd_count++] = fd_stderr;
 
-    /* Register stdio callbacks for the spawned process */
-    if (enable_stdin) {
-        fd = STDIN_FILENO;
-        status = HYDT_dmx_register_fd(1, &fd, HYD_POLLIN,
-                                      (void *) (size_t) fd_stdin, HYDT_bscu_stdio_cb);
-        HYDU_ERR_POP(status, "demux returned error registering fd\n");
-    }
-
     status = HYDT_dmx_register_fd(1, &fd_stdout, HYD_POLLIN,
                                   (void *) (size_t) STDOUT_FILENO, HYDT_bscu_stdio_cb);
     HYDU_ERR_POP(status, "demux returned error registering fd\n");

Modified: mpich2/trunk/src/pm/hydra/tools/bootstrap/external/slurm.h
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bootstrap/external/slurm.h	2011-01-12 09:08:49 UTC (rev 7691)
+++ mpich2/trunk/src/pm/hydra/tools/bootstrap/external/slurm.h	2011-01-12 09:09:20 UTC (rev 7692)
@@ -10,7 +10,7 @@
 #include "hydra.h"
 
 HYD_status HYDT_bscd_slurm_launch_procs(char **args, struct HYD_node *node_list,
-                                        int *control_fd, int enable_stdin);
+                                        int *control_fd);
 HYD_status HYDT_bscd_slurm_query_proxy_id(int *proxy_id);
 HYD_status HYDT_bscd_slurm_query_node_list(struct HYD_node **node_list);
 

Modified: mpich2/trunk/src/pm/hydra/tools/bootstrap/external/slurm_launch.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bootstrap/external/slurm_launch.c	2011-01-12 09:08:49 UTC (rev 7691)
+++ mpich2/trunk/src/pm/hydra/tools/bootstrap/external/slurm_launch.c	2011-01-12 09:09:20 UTC (rev 7692)
@@ -10,7 +10,7 @@
 #include "bind.h"
 #include "slurm.h"
 
-static int fd_stdin, fd_stdout, fd_stderr;
+static int fd_stdout, fd_stderr;
 
 static HYD_status node_list_to_str(struct HYD_node *node_list, char **node_list_str)
 {
@@ -60,9 +60,9 @@
 }
 
 HYD_status HYDT_bscd_slurm_launch_procs(char **args, struct HYD_node *node_list,
-                                        int *control_fd, int enable_stdin)
+                                        int *control_fd)
 {
-    int num_hosts, idx, i, fd;
+    int num_hosts, idx, i;
     int *pid, *fd_list;
     char *targs[HYD_NUM_TMP_STRINGS], *node_list_str = NULL;
     char *path = NULL, *extra_arg_list = NULL, *extra_arg;
@@ -141,23 +141,13 @@
     }
 
     HYDT_bind_cpuset_zero(&cpuset);
-    status = HYDU_create_process(targs, NULL,
-                                 enable_stdin ? &fd_stdin : NULL, &fd_stdout,
-                                 &fd_stderr, &HYD_bscu_pid_list[HYD_bscu_pid_count++], cpuset);
+    status = HYDU_create_process(targs, NULL, NULL, &fd_stdout, &fd_stderr,
+                                 &HYD_bscu_pid_list[HYD_bscu_pid_count++], cpuset);
     HYDU_ERR_POP(status, "create process returned error\n");
 
-    /* We don't wait for stdin to close */
     HYD_bscu_fd_list[HYD_bscu_fd_count++] = fd_stdout;
     HYD_bscu_fd_list[HYD_bscu_fd_count++] = fd_stderr;
 
-    /* Register stdio callbacks for the spawned process */
-    if (enable_stdin) {
-        fd = STDIN_FILENO;
-        status = HYDT_dmx_register_fd(1, &fd, HYD_POLLIN,
-                                      (void *) (size_t) fd_stdin, HYDT_bscu_stdio_cb);
-        HYDU_ERR_POP(status, "demux returned error registering fd\n");
-    }
-
     status = HYDT_dmx_register_fd(1, &fd_stdout, HYD_POLLIN,
                                   (void *) (size_t) STDOUT_FILENO, HYDT_bscu_stdio_cb);
     HYDU_ERR_POP(status, "demux returned error registering fd\n");

Modified: mpich2/trunk/src/pm/hydra/tools/bootstrap/include/bsci.h.in
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bootstrap/include/bsci.h.in	2011-01-12 09:08:49 UTC (rev 7691)
+++ mpich2/trunk/src/pm/hydra/tools/bootstrap/include/bsci.h.in	2011-01-12 09:09:20 UTC (rev 7692)
@@ -51,8 +51,7 @@
 
     /* Launcher functions */
     /** \brief Launch processes */
-    HYD_status(*launch_procs) (
-        char **args, struct HYD_node *node_list, int *control_fd, int enable_stdin);
+    HYD_status(*launch_procs) (char **args, struct HYD_node *node_list, int *control_fd);
 
     /** \brief Finalize the bootstrap control device */
     HYD_status(*launcher_finalize) (void);
@@ -100,7 +99,6 @@
  * \param[in]   args            Arguments to be used for the launched processes
  * \param[in]   node_list       List of nodes to launch processes on
  * \param[out]  control_fd      Control socket to communicate with the launched process
- * \param[in]   enable_stdin    Whether to enable stdin or not
  * \param[in]   stdout_cb       Stdout callback function
  * \param[in]   stderr_cb       Stderr callback function
  *
@@ -115,8 +113,7 @@
  * but allow proxies to query their ID information on each node using
  * the HYDT_bsci_query_proxy_id function.
  */
-HYD_status HYDT_bsci_launch_procs(
-    char **args, struct HYD_node *node_list, int *control_fd, int enable_stdin);
+HYD_status HYDT_bsci_launch_procs(char **args, struct HYD_node *node_list, int *control_fd);
 
 
 /**

Modified: mpich2/trunk/src/pm/hydra/tools/bootstrap/persist/persist_client.h
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bootstrap/persist/persist_client.h	2011-01-12 09:08:49 UTC (rev 7691)
+++ mpich2/trunk/src/pm/hydra/tools/bootstrap/persist/persist_client.h	2011-01-12 09:09:20 UTC (rev 7692)
@@ -12,7 +12,7 @@
 #include "persist.h"
 
 HYD_status HYDT_bscd_persist_launch_procs(char **args, struct HYD_node *node_list,
-                                          int *control_fd, int enable_stdin);
+                                          int *control_fd);
 HYD_status HYDT_bscd_persist_wait_for_completion(int timeout);
 
 extern int *HYDT_bscd_persist_control_fd;

Modified: mpich2/trunk/src/pm/hydra/tools/bootstrap/persist/persist_launch.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bootstrap/persist/persist_launch.c	2011-01-12 09:08:49 UTC (rev 7691)
+++ mpich2/trunk/src/pm/hydra/tools/bootstrap/persist/persist_launch.c	2011-01-12 09:09:20 UTC (rev 7692)
@@ -59,10 +59,10 @@
 }
 
 HYD_status HYDT_bscd_persist_launch_procs(char **args, struct HYD_node *node_list,
-                                          int *control_fd, int enable_stdin)
+                                          int *control_fd)
 {
     struct HYD_node *node;
-    int idx, i, tmp_fd;
+    int idx, i;
     HYD_status status = HYD_SUCCESS;
 
     HYDU_FUNC_ENTER();
@@ -89,14 +89,6 @@
         status = HYDU_send_strlist(HYDT_bscd_persist_control_fd[i], args);
         HYDU_ERR_POP(status, "error sending information to hydserv\n");
 
-        if (i == 0 && enable_stdin) {
-            tmp_fd = STDIN_FILENO;
-            status = HYDT_dmx_register_fd(1, &tmp_fd, HYD_POLLIN,
-                                          &HYDT_bscd_persist_control_fd[i],
-                                          HYDT_bscu_stdio_cb);
-            HYDU_ERR_POP(status, "demux returned error registering fd\n");
-        }
-
         status = HYDT_dmx_register_fd(1, &HYDT_bscd_persist_control_fd[i], HYD_POLLIN, NULL,
                                       persist_cb);
         HYDU_ERR_POP(status, "demux returned error registering fd\n");

Modified: mpich2/trunk/src/pm/hydra/tools/bootstrap/persist/persist_server.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bootstrap/persist/persist_server.c	2011-01-12 09:08:49 UTC (rev 7691)
+++ mpich2/trunk/src/pm/hydra/tools/bootstrap/persist/persist_server.c	2011-01-12 09:09:20 UTC (rev 7692)
@@ -21,7 +21,6 @@
 
     /* client variables */
     int client_fd;
-    int stdin_fd;
     int stdout_fd;
     int stderr_fd;
     int app_pid;
@@ -72,19 +71,7 @@
 
     HYDU_FUNC_ENTER();
 
-    if (fd == private.client_fd) {
-        /* stdin event */
-        status = HYDU_sock_forward_stdio(private.client_fd, private.stdin_fd, &closed);
-        HYDU_ERR_POP(status, "stdin forwarding error\n");
-
-        if (closed) {
-            status = HYDT_dmx_deregister_fd(private.client_fd);
-            HYDU_ERR_SETANDJUMP(status, status, "error deregistering fd %d\n",
-                                private.client_fd);
-            close(private.client_fd);
-        }
-    }
-    else if (fd == private.stdout_fd) {
+    if (fd == private.stdout_fd) {
         /* stdout event */
         status = HYDU_sock_read(private.stdout_fd, buf, HYD_TMPBUF_SIZE, &count,
                                 &closed, HYDU_SOCK_COMM_NONE);
@@ -207,7 +194,7 @@
 
     /* spawn process */
     HYDT_bind_cpuset_zero(&cpuset);
-    status = HYDU_create_process(args, NULL, &private.stdin_fd, &private.stdout_fd,
+    status = HYDU_create_process(args, NULL, NULL, &private.stdout_fd,
                                  &private.stderr_fd, &private.app_pid, cpuset);
     HYDU_ERR_POP(status, "unable to create process\n");
 

Modified: mpich2/trunk/src/pm/hydra/tools/bootstrap/src/bsci_launch.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bootstrap/src/bsci_launch.c	2011-01-12 09:08:49 UTC (rev 7691)
+++ mpich2/trunk/src/pm/hydra/tools/bootstrap/src/bsci_launch.c	2011-01-12 09:09:20 UTC (rev 7692)
@@ -7,14 +7,13 @@
 #include "hydra.h"
 #include "bsci.h"
 
-HYD_status HYDT_bsci_launch_procs(char **args, struct HYD_node *node_list, int *control_fd,
-                                  int enable_stdin)
+HYD_status HYDT_bsci_launch_procs(char **args, struct HYD_node *node_list, int *control_fd)
 {
     HYD_status status = HYD_SUCCESS;
 
     HYDU_FUNC_ENTER();
 
-    status = HYDT_bsci_fns.launch_procs(args, node_list, control_fd, enable_stdin);
+    status = HYDT_bsci_fns.launch_procs(args, node_list, control_fd);
     HYDU_ERR_POP(status, "launcher returned error while launching processes\n");
 
   fn_exit:

Modified: mpich2/trunk/src/pm/hydra/tools/bootstrap/utils/bscu_cb.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bootstrap/utils/bscu_cb.c	2011-01-12 09:08:49 UTC (rev 7691)
+++ mpich2/trunk/src/pm/hydra/tools/bootstrap/utils/bscu_cb.c	2011-01-12 09:09:20 UTC (rev 7692)
@@ -32,8 +32,6 @@
         }
 
         close(fd);
-        if (fd == STDIN_FILENO)
-            close(stdfd);
     }
 
   fn_exit:

Modified: mpich2/trunk/src/pm/hydra/tools/demux/demux.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/demux/demux.c	2011-01-12 09:08:49 UTC (rev 7691)
+++ mpich2/trunk/src/pm/hydra/tools/demux/demux.c	2011-01-12 09:09:20 UTC (rev 7692)
@@ -11,16 +11,15 @@
 struct HYDT_dmxu_callback *HYDT_dmxu_cb_list = NULL;
 struct HYDT_dmxu_fns HYDT_dmxu_fns = { 0 };
 
-int HYDT_dmxu_got_sigttin = 0;
+static int got_sigttin = 0;
 
 #if defined(SIGTTIN) && defined(HAVE_ISATTY)
 static void signal_cb(int sig)
 {
     HYDU_FUNC_ENTER();
 
-    if (sig == SIGTTIN) {
-        HYDT_dmxu_got_sigttin = 1;
-    }
+    if (sig == SIGTTIN)
+        got_sigttin = 1;
     /* Ignore all other signals */
 
     HYDU_FUNC_EXIT();
@@ -64,13 +63,6 @@
                             "cannot find an appropriate demux engine\n");
     }
 
-#if defined(SIGTTIN) && defined(HAVE_ISATTY)
-    if (isatty(STDIN_FILENO)) {
-        status = HYDU_set_signal(SIGTTIN, signal_cb);
-        HYDU_ERR_POP(status, "unable to set SIGTTIN\n");
-    }
-#endif /* SIGTTIN and HAVE_ISATTY */
-
   fn_exit:
     HYDU_FUNC_EXIT();
     return status;
@@ -223,6 +215,47 @@
     return status;
 }
 
+HYD_status HYDT_dmxi_stdin_valid(int *out)
+{
+    int ret;
+    HYD_status status = HYD_SUCCESS;
+
+    HYDU_FUNC_ENTER();
+
+    /* This is an extremely round-about way of solving a simple
+     * problem. isatty(STDIN_FILENO) seems to return 1, even when
+     * mpiexec is run in the background. So, instead of relying on
+     * that, we catch SIGTTIN and ignore it. But that causes the
+     * read() call to return an error (with errno == EINTR) when we
+     * are not attached to the terminal. */
+#if defined(SIGTTIN) && defined(HAVE_ISATTY)
+    if (isatty(STDIN_FILENO)) {
+        status = HYDU_set_signal(SIGTTIN, signal_cb);
+        HYDU_ERR_POP(status, "unable to set SIGTTIN\n");
+    }
+#endif /* SIGTTIN and HAVE_ISATTY */
+
+    ret = read(STDIN_FILENO, NULL, 0);
+    if (ret < 0 && errno == EINTR && got_sigttin)
+        *out = 0;
+    else
+        *out = 1;
+
+#if defined(SIGTTIN) && defined(HAVE_ISATTY)
+    if (isatty(STDIN_FILENO)) {
+        status = HYDU_set_signal(SIGTTIN, SIG_IGN);
+        HYDU_ERR_POP(status, "unable to set SIGTTIN\n");
+    }
+#endif /* SIGTTIN and HAVE_ISATTY */
+
+  fn_exit:
+    HYDU_FUNC_EXIT();
+    return status;
+
+  fn_fail:
+    goto fn_exit;
+}
+
 HYD_status HYDT_dmx_stdin_valid(int *out)
 {
     return HYDT_dmxu_fns.stdin_valid(out);

Modified: mpich2/trunk/src/pm/hydra/tools/demux/demux_internal.h
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/demux/demux_internal.h	2011-01-12 09:08:49 UTC (rev 7691)
+++ mpich2/trunk/src/pm/hydra/tools/demux/demux_internal.h	2011-01-12 09:09:20 UTC (rev 7692)
@@ -28,6 +28,8 @@
     HYD_status(*stdin_valid) (int *out);
 };
 
+HYD_status HYDT_dmxi_stdin_valid(int *out);
+
 #if defined HAVE_POLL
 HYD_status HYDT_dmxu_poll_wait_for_event(int wtime);
 HYD_status HYDT_dmxu_poll_stdin_valid(int *out);

Modified: mpich2/trunk/src/pm/hydra/tools/demux/demux_poll.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/demux/demux_poll.c	2011-01-12 09:08:49 UTC (rev 7691)
+++ mpich2/trunk/src/pm/hydra/tools/demux/demux_poll.c	2011-01-12 09:09:20 UTC (rev 7692)
@@ -107,29 +107,27 @@
 
     HYDU_FUNC_ENTER();
 
-    fd[0].fd = STDIN_FILENO;
-    fd[0].events = POLLIN;
+    status = HYDT_dmxi_stdin_valid(out);
+    HYDU_ERR_POP(status, "unable to check if stdin is valid\n");
 
-    /* Check if poll on stdin returns any errors; on Darwin this is
-     * broken */
-    ret = poll(fd, 1, 0);
-    HYDU_ASSERT((ret >= 0), status);
+    if (*out) {
+        /* The generic test thinks that STDIN is valid. Try poll
+         * specific tests. */
 
-    if (fd[0].revents & ~(POLLIN | POLLHUP))
-        *out = 0;
-    else
-        *out = 1;
+        fd[0].fd = STDIN_FILENO;
+        fd[0].events = POLLIN;
 
-    /* This is an extremely round-about way of solving a simple
-     * problem. isatty(STDIN_FILENO) seems to return 1, even when
-     * mpiexec is run in the background. So, instead of relying on
-     * that, we catch SIGTTIN and ignore it. But that causes the
-     * read() call to return an error (with errno == EINTR) when we
-     * are not attached to the terminal. */
-    ret = read(STDIN_FILENO, NULL, 0);
-    if (ret < 0 && errno == EINTR && HYDT_dmxu_got_sigttin)
-        *out = 0;
+        /* Check if poll on stdin returns any errors; on Darwin this
+         * is broken */
+        ret = poll(fd, 1, 0);
+        HYDU_ASSERT((ret >= 0), status);
 
+        if (fd[0].revents & ~(POLLIN | POLLHUP))
+            *out = 0;
+        else
+            *out = 1;
+    }
+
   fn_exit:
     HYDU_FUNC_EXIT();
     return status;

Modified: mpich2/trunk/src/pm/hydra/tools/demux/demux_select.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/demux/demux_select.c	2011-01-12 09:08:49 UTC (rev 7691)
+++ mpich2/trunk/src/pm/hydra/tools/demux/demux_select.c	2011-01-12 09:09:20 UTC (rev 7692)
@@ -101,28 +101,26 @@
 
     HYDU_FUNC_ENTER();
 
-    FD_ZERO(&exceptfds);
-    FD_SET(STDIN_FILENO, &exceptfds);
+    status = HYDT_dmxi_stdin_valid(out);
+    HYDU_ERR_POP(status, "unable to check if stdin is valid\n");
 
-    /* Check if select on stdin returns any errors */
-    ret = select(STDIN_FILENO + 1, NULL, NULL, &exceptfds, &zero);
-    HYDU_ASSERT((ret >= 0), status);
+    if (*out) {
+        /* The generic test thinks that STDIN is valid. Try select
+         * specific tests. */
 
-    if (FD_ISSET(STDIN_FILENO, &exceptfds))
-        *out = 0;
-    else
-        *out = 1;
+        FD_ZERO(&exceptfds);
+        FD_SET(STDIN_FILENO, &exceptfds);
 
-    /* This is an extremely round-about way of solving a simple
-     * problem. isatty(STDIN_FILENO) seems to return 1, even when
-     * mpiexec is run in the background. So, instead of relying on
-     * that, we catch SIGTTIN and ignore it. But that causes the
-     * read() call to return an error (with errno == EINTR) when we
-     * are not attached to the terminal. */
-    ret = read(STDIN_FILENO, NULL, 0);
-    if (ret < 0 && errno == EINTR && HYDT_dmxu_got_sigttin)
-        *out = 0;
+        /* Check if select on stdin returns any errors */
+        ret = select(STDIN_FILENO + 1, NULL, NULL, &exceptfds, &zero);
+        HYDU_ASSERT((ret >= 0), status);
 
+        if (FD_ISSET(STDIN_FILENO, &exceptfds))
+            *out = 0;
+        else
+            *out = 1;
+    }
+
   fn_exit:
     HYDU_FUNC_EXIT();
     return status;

Modified: mpich2/trunk/src/pm/hydra/ui/mpich/mpiexec.c
===================================================================
--- mpich2/trunk/src/pm/hydra/ui/mpich/mpiexec.c	2011-01-12 09:08:49 UTC (rev 7691)
+++ mpich2/trunk/src/pm/hydra/ui/mpich/mpiexec.c	2011-01-12 09:09:20 UTC (rev 7692)
@@ -391,7 +391,7 @@
         }
     }
 
-    /* Add the stdout/stdin/stderr callback handlers */
+    /* Add the stdout/stderr callback handlers */
     HYD_server_info.stdout_cb = HYD_uiu_stdout_cb;
     HYD_server_info.stderr_cb = HYD_uiu_stderr_cb;
 



More information about the mpich2-commits mailing list