forked from OSchip/llvm-project
Fix TestProcesslaunch regression caused by D7372
Summary: After closing all the leaked file descriptors to the inferior tty, the following problem occured: - when stdin, stdout and stderr are redirected, there are no slave descriptors open (which is good) - lldb has a reader thread, which attempts to read from the master end of the tty - this thread receives an EOF - in response, it closes it's master end - as this is the last open file descriptor for the master end, this deletes the tty and sends SIGHUP to the inferior (this is bad) I fix this problem by making sure the master end remains open for the duration of the inferior process by storing a copy of the file descriptor in ProcessMonitor. I create a copy to avoid ownership issues with the reading thread. Reviewers: ovyalov, emaste Subscribers: lldb-commits Differential Revision: http://reviews.llvm.org/D7440 llvm-svn: 228391
This commit is contained in:
parent
77f62d45ef
commit
3a2da9eb0d
|
@ -1587,11 +1587,10 @@ ProcessMonitor::StopMonitor()
|
|||
StopOpThread();
|
||||
sem_destroy(&m_operation_pending);
|
||||
sem_destroy(&m_operation_done);
|
||||
|
||||
// Note: ProcessPOSIX passes the m_terminal_fd file descriptor to
|
||||
// Process::SetSTDIOFileDescriptor, which in turn transfers ownership of
|
||||
// the descriptor to a ConnectionFileDescriptor object. Consequently
|
||||
// even though still has the file descriptor, we shouldn't close it here.
|
||||
if (m_terminal_fd >= 0) {
|
||||
close(m_terminal_fd);
|
||||
m_terminal_fd = -1;
|
||||
}
|
||||
}
|
||||
|
||||
// FIXME: On Linux, when a new thread is created, we receive to notifications,
|
||||
|
|
|
@ -79,7 +79,8 @@ public:
|
|||
/// Reads from this file descriptor yield both the standard output and
|
||||
/// standard error of this debugee. Even if stderr and stdout were
|
||||
/// redirected on launch it may still happen that data is available on this
|
||||
/// descriptor (if the inferior process opens /dev/tty, for example).
|
||||
/// descriptor (if the inferior process opens /dev/tty, for example). This descriptor is
|
||||
/// closed after a call to StopMonitor().
|
||||
///
|
||||
/// If this monitor was attached to an existing process this method returns
|
||||
/// -1.
|
||||
|
|
|
@ -2345,11 +2345,10 @@ ProcessMonitor::StopMonitor()
|
|||
StopOpThread();
|
||||
sem_destroy(&m_operation_pending);
|
||||
sem_destroy(&m_operation_done);
|
||||
|
||||
// Note: ProcessPOSIX passes the m_terminal_fd file descriptor to
|
||||
// Process::SetSTDIOFileDescriptor, which in turn transfers ownership of
|
||||
// the descriptor to a ConnectionFileDescriptor object. Consequently
|
||||
// even though still has the file descriptor, we shouldn't close it here.
|
||||
if (m_terminal_fd >= 0) {
|
||||
close(m_terminal_fd);
|
||||
m_terminal_fd = -1;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -84,7 +84,8 @@ public:
|
|||
/// Reads from this file descriptor yield both the standard output and
|
||||
/// standard error of this debugee. Even if stderr and stdout were
|
||||
/// redirected on launch it may still happen that data is available on this
|
||||
/// descriptor (if the inferior process opens /dev/tty, for example).
|
||||
/// descriptor (if the inferior process opens /dev/tty, for example). This descriptor is
|
||||
/// closed after a call to StopMonitor().
|
||||
///
|
||||
/// If this monitor was attached to an existing process this method returns
|
||||
/// -1.
|
||||
|
|
|
@ -252,7 +252,16 @@ ProcessPOSIX::DoLaunch (Module *module,
|
|||
if (!error.Success())
|
||||
return error;
|
||||
|
||||
SetSTDIOFileDescriptor(m_monitor->GetTerminalFD());
|
||||
int terminal = m_monitor->GetTerminalFD();
|
||||
if (terminal >= 0) {
|
||||
// The reader thread will close the file descriptor when done, so we pass it a copy.
|
||||
int stdio = fcntl(terminal, F_DUPFD_CLOEXEC, 0);
|
||||
if (stdio == -1) {
|
||||
error.SetErrorToErrno();
|
||||
return error;
|
||||
}
|
||||
SetSTDIOFileDescriptor(stdio);
|
||||
}
|
||||
|
||||
SetID(m_monitor->GetPID());
|
||||
return error;
|
||||
|
|
Loading…
Reference in New Issue