1
1

* Add support for using ptys for stdout when doing I/O forwarding. This is

enough to make use applications be line buffered instead of block buffered,
  which makes output come much faster :)

This commit was SVN r5400.
Этот коммит содержится в:
Brian Barrett 2005-04-15 21:18:20 +00:00
родитель fe70c2ceed
Коммит e3587652b7
4 изменённых файлов: 41 добавлений и 41 удалений

Просмотреть файл

@ -341,4 +341,19 @@ fi
AC_MSG_RESULT([$OMPI_FORTRAN_MAX_ARRAY_RANK]) AC_MSG_RESULT([$OMPI_FORTRAN_MAX_ARRAY_RANK])
AC_SUBST(OMPI_FORTRAN_MAX_ARRAY_RANK) AC_SUBST(OMPI_FORTRAN_MAX_ARRAY_RANK)
# do we want PTY support?
AC_MSG_CHECKING([if pty support should be enabled])
AC_ARG_ENABLE(pty-support,
AC_HELP_STRING([--enable-pty-support],
[Enable/disable PTY support for STDIO forwarding. default: enabled]))
if test "$enable_pty_support" = "no" ; then
AC_MSG_RESULT([no])
OMPI_ENABLE_PTY_SUPPORT=0
else
AC_MSG_RESULT([yes])
OMPI_ENABLE_PTY_SUPPORT=1
fi
AC_DEFINE_UNQUOTED([OMPI_ENABLE_PTY_SUPPORT], [$OMPI_ENABLE_PTY_SUPPORT],
[Whether user wants PTY support or not])
]) ])

Просмотреть файл

@ -980,13 +980,16 @@ AC_DEFINE_UNQUOTED(OMPI_RANGE_F90_COMPLEX32, $OMPI_RANGE_F90_COMPLEX32,
ompi_show_title "Header file tests" ompi_show_title "Header file tests"
AC_CHECK_HEADERS([alloca.h aio.h arpa/inet.h dirent.h dlfcn.h execinfo.h \ AC_CHECK_HEADERS([alloca.h aio.h arpa/inet.h dirent.h \
fcntl.h sys/fcntl.h inttypes.h libgen.h net/if.h netdb.h netinet/in.h netinet/tcp.h \ dlfcn.h execinfo.h err.h fcntl.h inttypes.h libgen.h \
sys/stat.h poll.h pthread.h pwd.h sched.h stdint.h string.hstrings.h stropts.h \ net/if.h netdb.h netinet/in.h netinet/tcp.h \
sys/types.h sys/ipc.h sys/mman.h sys/resource.h sys/select.h sys/socket.h \ poll.h pthread.h pty.h pwd.h sched.h stdint.h \
sys/ioctl.h err.h sys/statvfs.h sys/time.h sys/uio.h sys/utsname.h sys/wait.h \ string.h strings.h stropts.h sys/fcntl.h sys/ipc.h \
syslog.h termios.h ulimit.h unistd.h sys/param.h sys/tree.h sys/queue.h \ sys/ioctl.h sys/mman.h sys/param.h sys/queue.h \
sys/sockio.h time.h]) sys/resource.h sys/select.h sys/socket.h sys/sockio.h \
sys/stat.h sys/statvfs.h sys/time.h sys/tree.h \
sys/types.h sys/uio.h sys/utsname.h sys/wait.h syslog.h \
time.h termios.h ulimit.h unistd.h util.h])
# SA_RESTART in signal.h # SA_RESTART in signal.h
AC_MSG_CHECKING([if SA_RESTART defined in signal.h]) AC_MSG_CHECKING([if SA_RESTART defined in signal.h])
@ -1053,17 +1056,15 @@ ompi_show_title "Library and Function tests"
# -lsocket # -lsocket
# -lnsl # -lnsl
# -lutil (openpty)
# openpty
# atexit # atexit
# getcwd # getcwd
# snprintf
# atoll # atoll
# strtoll # strtoll
# yield # yield
# vscanf # vscanf
AC_CHECK_FUNCS([asprintf snprintf vasprintf vsnprintf]) AC_CHECK_LIB([util], [openpty], [WRAPPER_EXTRA_LIBS="$WRAPPER_EXTRA_LIBS -lutil" LIBLAM_EXTRA_LIBS="$LIBLAMEXTRALIBS -lutil" LIBS="$LIBS -lutil]")
AC_CHECK_FUNCS([asprintf snprintf vasprintf vsnprintf openpty isatty])
# #
# Make sure we can copy va_lists (need check declared, not linkable) # Make sure we can copy va_lists (need check declared, not linkable)
@ -1247,10 +1248,7 @@ AC_WORDS_BIGENDIAN
# all: SYSV semaphores # all: SYSV semaphores
# all: SYSV shared memory # all: SYSV shared memory
# all: thread flavor
# all: size of FD_SET # all: size of FD_SET
# all: FD passing (or not!!)
# all: BSD vs. SYSV ptys
# all: sizeof struct stat members # all: sizeof struct stat members
# all: type of getsockopt optlen # all: type of getsockopt optlen
# all: type of recvfrom optlen # all: type of recvfrom optlen

Просмотреть файл

@ -28,7 +28,8 @@ headers = \
base.h \ base.h \
iof_base_header.h \ iof_base_header.h \
iof_base_endpoint.h \ iof_base_endpoint.h \
iof_base_fragment.h iof_base_fragment.h \
iof_base_setup.h
libmca_iof_base_la_SOURCES = \ libmca_iof_base_la_SOURCES = \
$(headers) \ $(headers) \
@ -37,7 +38,8 @@ libmca_iof_base_la_SOURCES = \
iof_base_flush.c \ iof_base_flush.c \
iof_base_endpoint.c \ iof_base_endpoint.c \
iof_base_fragment.c \ iof_base_fragment.c \
iof_base_select.c iof_base_select.c \
iof_base_setup.c
# Conditionally install the header files # Conditionally install the header files

Просмотреть файл

@ -38,6 +38,7 @@
#include "runtime/orte_wait.h" #include "runtime/orte_wait.h"
#include "mca/errmgr/errmgr.h" #include "mca/errmgr/errmgr.h"
#include "mca/iof/iof.h" #include "mca/iof/iof.h"
#include "mca/iof/base/iof_base_setup.h"
#include "mca/base/mca_base_param.h" #include "mca/base/mca_base_param.h"
#include "mca/ns/ns.h" #include "mca/ns/ns.h"
#include "mca/ns/base/ns_base_nds.h" #include "mca/ns/base/ns_base_nds.h"
@ -109,12 +110,15 @@ static int orte_pls_fork_proc(
orte_vpid_t vpid_range) orte_vpid_t vpid_range)
{ {
pid_t pid; pid_t pid;
int p_stdout[2]; mca_iof_base_io_conf_t opts;
int p_stderr[2];
int rc; int rc;
if(pipe(p_stdout) < 0 || /* should pull this information from MPIRUN instead of going with
pipe(p_stderr) < 0) { default */
opts.usepty = OMPI_ENABLE_PTY_SUPPORT;
rc = iof_base_setup_prefork(&opts);
if (OMPI_SUCCESS != rc) {
ORTE_ERROR_LOG(ORTE_ERR_OUT_OF_RESOURCE); ORTE_ERROR_LOG(ORTE_ERR_OUT_OF_RESOURCE);
return ORTE_ERR_OUT_OF_RESOURCE; return ORTE_ERR_OUT_OF_RESOURCE;
} }
@ -167,16 +171,7 @@ static int orte_pls_fork_proc(
&environ_copy); &environ_copy);
/* setup stdout/stderr */ /* setup stdout/stderr */
close(p_stdout[0]); iof_base_setup_child(&opts);
close(p_stderr[0]);
if(p_stdout[1] != STDOUT_FILENO) {
dup2(p_stdout[1], STDOUT_FILENO);
close(p_stdout[1]);
}
if(p_stderr[1] != STDERR_FILENO) {
dup2(p_stderr[1], STDERR_FILENO);
close(p_stderr[1]);
}
/* execute application */ /* execute application */
new_env = ompi_environ_merge(context->env, environ_copy); new_env = ompi_environ_merge(context->env, environ_copy);
@ -202,10 +197,6 @@ static int orte_pls_fork_proc(
OBJ_RETAIN(proc); OBJ_RETAIN(proc);
orte_wait_cb(pid, orte_pls_fork_wait_proc, proc); orte_wait_cb(pid, orte_pls_fork_wait_proc, proc);
/* close write end of pipes */
close(p_stdout[1]);
close(p_stderr[1]);
/* save the pid in the registry */ /* save the pid in the registry */
if(ORTE_SUCCESS != (rc = orte_pls_base_set_proc_pid(&proc->proc_name, pid))) { if(ORTE_SUCCESS != (rc = orte_pls_base_set_proc_pid(&proc->proc_name, pid))) {
ORTE_ERROR_LOG(rc); ORTE_ERROR_LOG(rc);
@ -213,13 +204,7 @@ static int orte_pls_fork_proc(
} }
/* connect read end to IOF */ /* connect read end to IOF */
rc = orte_iof.iof_publish(&proc->proc_name, ORTE_IOF_SOURCE, ORTE_IOF_STDOUT, p_stdout[0]); rc = iof_base_setup_parent(&proc->proc_name, &opts);
if(ORTE_SUCCESS != rc) {
ORTE_ERROR_LOG(rc);
return rc;
}
rc = orte_iof.iof_publish(&proc->proc_name, ORTE_IOF_SOURCE, ORTE_IOF_STDERR, p_stderr[0]);
if(ORTE_SUCCESS != rc) { if(ORTE_SUCCESS != rc) {
ORTE_ERROR_LOG(rc); ORTE_ERROR_LOG(rc);
return rc; return rc;