Fix on Linux for ReadThread lingering after inferior exits

See this email thread:
http://lists.cs.uiuc.edu/pipermail/lldb-commits/Week-of-Mon-20140818/012487.html

This patch handles the case where the inferior process exits but leaves the ReadThread in a continuous loop reading from the communication pipe.  On MacOSX, the ReadThread exits when it receives a 0 return value from the read due to EOF.  On Linux the read returns -1 and sets errno to EIO error, this does not currently cause the thread to shutdown so it continues to read from the comm.   In Communication::ReadThread I added a handler for eConnectionStatusError to disconnect and shutdown the thread.

Change by Alex Pepper.

llvm-svn: 216194
This commit is contained in:
Todd Fiala 2014-08-21 17:16:26 +00:00
parent dfdda0d41c
commit 4262828132
1 changed files with 13 additions and 2 deletions

View File

@ -380,13 +380,24 @@ Communication::ReadThread (lldb::thread_arg_t p)
if (comm->GetCloseOnEOF())
done = true;
break;
case eConnectionStatusError: // Check GetError() for details
if (error.GetType() == eErrorTypePOSIX && error.GetError() == EIO)
{
// EIO on a pipe is usually caused by remote shutdown
comm->Disconnect ();
done = true;
}
if (log)
error.LogIfError (log,
"%p Communication::ReadFromConnection () => status = %s",
p,
Communication::ConnectionStatusAsCString (status));
break;
case eConnectionStatusNoConnection: // No connection
case eConnectionStatusLostConnection: // Lost connection while connected to a valid connection
case eConnectionStatusInterrupted: // Interrupted
done = true;
// Fall through...
case eConnectionStatusError: // Check GetError() for details
case eConnectionStatusTimedOut: // Request timed out
if (log)
error.LogIfError (log,