[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