* Fix situation where we were unlocking a mutex we didn't own in an error
cleanup code in the signal part of the event library * Only attempt to forward standard input if we have a controlling terminal (isatty() returns 1) and we are the foreground process OR we do not have a controlling terminal (isatty() returns 0). If we have a controlling terminal, check at each SIGCONT if we should change our forwarding, since our foreground / background status may have changed. Unfortunately, there isn't a great way in the iof framework to know if we are capturing a starter's stdin. Use the logic that if it's a source AND tagged as standard input, it's a starter's stdin. This seems to work for all the common usages. Both these need to go to the v1.0 branch. This commit was SVN r8894.
Этот коммит содержится в:
родитель
7c247eea01
Коммит
03f6a8529c
@ -127,8 +127,7 @@ opal_evsignal_add(sigset_t *evsigmask, struct opal_event *ev)
|
|||||||
gives a window where a signal handler *should* be installed
|
gives a window where a signal handler *should* be installed
|
||||||
but actually is not. */
|
but actually is not. */
|
||||||
if (opal_evsel->recalc && opal_evsel->recalc(opal_evbase, 0) == -1) {
|
if (opal_evsel->recalc && opal_evsel->recalc(opal_evbase, 0) == -1) {
|
||||||
opal_output(0, "opal_event_loop: opal_evsel->recalc() failed.");
|
opal_output(0, "opal_evsignal_add: opal_evsel->recalc() failed.");
|
||||||
opal_mutex_unlock(&opal_event_lock);
|
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -223,6 +223,31 @@ static void orte_iof_base_endpoint_write_handler(int sd, short flags, void *user
|
|||||||
OPAL_THREAD_UNLOCK(&orte_iof_base.iof_lock);
|
OPAL_THREAD_UNLOCK(&orte_iof_base.iof_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* return true if we should read stdin from fd, false otherwise */
|
||||||
|
static bool orte_iof_base_endpoint_stdin_check(int fd)
|
||||||
|
{
|
||||||
|
if (isatty(fd) && (getpgrp() != tcgetpgrp(fd))) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void orte_iof_base_endpoint_stdin_cb(int sd, short flags, void *user)
|
||||||
|
{
|
||||||
|
orte_iof_base_endpoint_t* endpoint = (orte_iof_base_endpoint_t*)user;
|
||||||
|
bool should_process = orte_iof_base_endpoint_stdin_check(endpoint->ep_fd);
|
||||||
|
|
||||||
|
if (should_process) {
|
||||||
|
opal_event_add(&endpoint->ep_event, 0);
|
||||||
|
} else {
|
||||||
|
opal_event_del(&endpoint->ep_event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Lookup existing endpoint matching parameters
|
* Lookup existing endpoint matching parameters
|
||||||
* supplied to create.
|
* supplied to create.
|
||||||
@ -289,13 +314,32 @@ int orte_iof_base_endpoint_create(
|
|||||||
/* setup event handler */
|
/* setup event handler */
|
||||||
switch(mode) {
|
switch(mode) {
|
||||||
case ORTE_IOF_SOURCE:
|
case ORTE_IOF_SOURCE:
|
||||||
|
if (tag == ORTE_IOF_STDIN && isatty(endpoint->ep_fd)) {
|
||||||
|
/* We should avoid trying to read from stdin if we
|
||||||
|
have a terminal, but are backgrounded. Catch the
|
||||||
|
signals that are commonly used when we switch
|
||||||
|
between being backgrounded and not. If the
|
||||||
|
filedescriptor is not a tty, don't worry about it
|
||||||
|
and always stay connected. */
|
||||||
|
opal_signal_set(&(endpoint->ep_stdin_event),
|
||||||
|
SIGCONT,
|
||||||
|
orte_iof_base_endpoint_stdin_cb,
|
||||||
|
endpoint);
|
||||||
|
opal_signal_add(&(endpoint->ep_stdin_event), NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* always setup the event, but only add it if we should be
|
||||||
|
reading from stdin right now (per rules above) */
|
||||||
opal_event_set(
|
opal_event_set(
|
||||||
&endpoint->ep_event,
|
&endpoint->ep_event,
|
||||||
endpoint->ep_fd,
|
endpoint->ep_fd,
|
||||||
OPAL_EV_READ|OPAL_EV_PERSIST,
|
OPAL_EV_READ|OPAL_EV_PERSIST,
|
||||||
orte_iof_base_endpoint_read_handler,
|
orte_iof_base_endpoint_read_handler,
|
||||||
endpoint);
|
endpoint);
|
||||||
opal_event_add(&endpoint->ep_event, 0);
|
if (tag != ORTE_IOF_STDIN ||
|
||||||
|
orte_iof_base_endpoint_stdin_check(endpoint->ep_fd)) {
|
||||||
|
opal_event_add(&endpoint->ep_event, 0);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case ORTE_IOF_SINK:
|
case ORTE_IOF_SINK:
|
||||||
opal_event_set(
|
opal_event_set(
|
||||||
|
@ -34,6 +34,7 @@ struct orte_iof_base_endpoint_t {
|
|||||||
uint32_t ep_seq;
|
uint32_t ep_seq;
|
||||||
uint32_t ep_ack;
|
uint32_t ep_ack;
|
||||||
opal_event_t ep_event;
|
opal_event_t ep_event;
|
||||||
|
opal_event_t ep_stdin_event;
|
||||||
opal_list_t ep_frags;
|
opal_list_t ep_frags;
|
||||||
opal_list_t ep_callbacks;
|
opal_list_t ep_callbacks;
|
||||||
};
|
};
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user