diff options
author | Pavel Labath <labath@google.com> | 2015-09-03 09:30:17 +0000 |
---|---|---|
committer | Pavel Labath <labath@google.com> | 2015-09-03 09:30:17 +0000 |
commit | a9a43373e17ca0eb1cb667c9be97da577cc70b99 (patch) | |
tree | 4330a24e1dbb1abc9cb5273b06747f4a781bad30 | |
parent | 61efbc32a6b15baa856a89c62de5cb2100a9f866 (diff) | |
download | bcm5719-llvm-a9a43373e17ca0eb1cb667c9be97da577cc70b99.tar.gz bcm5719-llvm-a9a43373e17ca0eb1cb667c9be97da577cc70b99.zip |
Fix rare failure in TestProcessIO
Summary:
There was a race condition in Process class, where we would not wait for process stdout to
propagate fully before we would shut down the connection (repro case: slow down the stdio thread
by placing a sleep right at the end of the while loop in Communication::ReadThread). The Process
class already tried to solve this problem by synchronizing with the read thread in
Process::ShouldBroadcastEvent, but unfortunately the connection got closed before that in
Process::SetExitStatus. I solve this issue by delaying the connection shutdown until we get a
chance to process the event and synchronize. Alternatively, I could have moved the
synchronization point to an earlier point in SetExitStatus, but it seems safer to delay the
shutdown until other things get a chance to notice the process has exited.
Reviewers: clayborg, ovyalov
Subscribers: lldb-commits
Differential Revision: http://reviews.llvm.org/D12558
llvm-svn: 246753
-rw-r--r-- | lldb/source/Target/Process.cpp | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp index 531a14c00fa..c771be0bf9a 100644 --- a/lldb/source/Target/Process.cpp +++ b/lldb/source/Target/Process.cpp @@ -1479,12 +1479,7 @@ Process::SetExitStatus (int status, const char *cstr) else m_exit_string.clear(); - // When we exit, we no longer need to the communication channel - m_stdio_communication.Disconnect(); - m_stdio_communication.StopReadThread(); - m_stdin_forward = false; - - // And we don't need the input reader anymore as well + // When we exit, we don't need the input reader anymore if (m_process_input_reader) { m_process_input_reader->SetIsDone(true); @@ -4159,6 +4154,10 @@ Process::ShouldBroadcastEvent (Event *event_ptr) case eStateExited: case eStateUnloaded: m_stdio_communication.SynchronizeWithReadThread(); + m_stdio_communication.Disconnect(); + m_stdio_communication.StopReadThread(); + m_stdin_forward = false; + // fall-through case eStateConnected: case eStateAttaching: |