Author: labath Date: Thu Sep 3 04:30:17 2015 New Revision: 246753 URL: http://llvm.org/viewvc/llvm-project?rev=246753&view=rev Log: 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 Modified: lldb/trunk/source/Target/Process.cpp Modified: lldb/trunk/source/Target/Process.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Process.cpp?rev=246753&r1=246752&r2=246753&view=diff ============================================================================== --- lldb/trunk/source/Target/Process.cpp (original) +++ lldb/trunk/source/Target/Process.cpp Thu Sep 3 04:30:17 2015 @@ -1479,12 +1479,7 @@ Process::SetExitStatus (int status, cons 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 *ev 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: _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits