1
1

Cleanup a little on how we handle the stdin write when we encounter end-of-input. Ensure that mpirun handles it correctly if the proc receiving stdin is local to mpirun

This commit was SVN r19996.
Этот коммит содержится в:
Ralph Castain 2008-11-14 14:31:33 +00:00
родитель e4bdaac6d8
Коммит 101b6fdeb8
2 изменённых файлов: 23 добавлений и 19 удалений

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

@ -264,9 +264,9 @@ static int hnp_pull(const orte_process_name_t* dst_name,
} }
OPAL_OUTPUT_VERBOSE((1, orte_iof_base.iof_output, OPAL_OUTPUT_VERBOSE((1, orte_iof_base.iof_output,
"%s hnp:pull setting up %s to pass stdin", "%s hnp:pull setting up %s to pass stdin to fd %d",
ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), ORTE_NAME_PRINT(ORTE_PROC_MY_NAME),
ORTE_NAME_PRINT(dst_name))); ORTE_NAME_PRINT(dst_name), fd));
/* set the file descriptor to non-blocking - do this before we setup /* set the file descriptor to non-blocking - do this before we setup
* the sink in case it fires right away * the sink in case it fires right away
@ -359,6 +359,10 @@ static void stdin_write_handler(int fd, short event, void *cbdata)
goto DEPART; goto DEPART;
} }
num_written = write(wev->fd, output->data, output->numbytes); num_written = write(wev->fd, output->data, output->numbytes);
OPAL_OUTPUT_VERBOSE((1, orte_iof_base.iof_output,
"%s hnp:stdin:write:handler wrote %d bytes",
ORTE_NAME_PRINT(ORTE_PROC_MY_NAME),
num_written));
if (num_written < 0) { if (num_written < 0) {
if (EAGAIN == errno || EINTR == errno) { if (EAGAIN == errno || EINTR == errno) {
/* push this item back on the front of the list */ /* push this item back on the front of the list */
@ -368,11 +372,14 @@ static void stdin_write_handler(int fd, short event, void *cbdata)
*/ */
goto CHECK; goto CHECK;
} }
/* otherwise, something bad happened so all we can do is abort /* otherwise, something bad happened so all we can do is declare an
* this attempt * error and abort
*/ */
OBJ_RELEASE(output); OBJ_RELEASE(output);
goto ABORT; close(wev->fd);
opal_event_del(&wev->ev);
wev->pending = false;
goto DEPART;
} else if (num_written < output->numbytes) { } else if (num_written < output->numbytes) {
OPAL_OUTPUT_VERBOSE((1, orte_iof_base.iof_output, OPAL_OUTPUT_VERBOSE((1, orte_iof_base.iof_output,
"incomplete write %d - adjusting data", num_written)); "incomplete write %d - adjusting data", num_written));
@ -387,13 +394,10 @@ static void stdin_write_handler(int fd, short event, void *cbdata)
} }
OBJ_RELEASE(output); OBJ_RELEASE(output);
} }
ABORT:
close(wev->fd);
opal_event_del(&wev->ev);
wev->pending = false;
CHECK: CHECK:
if (!mca_iof_hnp_component.stdinev->active) { if (NULL != mca_iof_hnp_component.stdinev &&
!mca_iof_hnp_component.stdinev->active) {
OPAL_OUTPUT_VERBOSE((1, orte_iof_base.iof_output, OPAL_OUTPUT_VERBOSE((1, orte_iof_base.iof_output,
"read event is off - checking if okay to restart")); "read event is off - checking if okay to restart"));
/* if we have turned off the read event, check to /* if we have turned off the read event, check to

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

@ -260,11 +260,16 @@ static void stdin_write_handler(int fd, short event, void *cbdata)
*/ */
goto CHECK; goto CHECK;
} }
/* otherwise, something bad happened so all we can do is abort /* otherwise, something bad happened so all we can do is declare an
* this attempt * error and abort
*/ */
OBJ_RELEASE(output); OBJ_RELEASE(output);
goto ABORT; close(wev->fd);
opal_event_del(&wev->ev);
wev->pending = false;
/* tell the HNP to stop sending us stuff */
/* tell ourselves to dump anything that arrives */
goto DEPART;
} else if (num_written < output->numbytes) { } else if (num_written < output->numbytes) {
/* incomplete write - adjust data to avoid duplicate output */ /* incomplete write - adjust data to avoid duplicate output */
memmove(output->data, &output->data[num_written], output->numbytes - num_written); memmove(output->data, &output->data[num_written], output->numbytes - num_written);
@ -277,11 +282,6 @@ static void stdin_write_handler(int fd, short event, void *cbdata)
} }
OBJ_RELEASE(output); OBJ_RELEASE(output);
} }
goto CHECK; /* don't abort yet. Spurious event might happens */
ABORT:
close(wev->fd);
opal_event_del(&wev->ev);
wev->pending = false;
CHECK: CHECK:
if (mca_iof_orted_component.xoff) { if (mca_iof_orted_component.xoff) {