void * Communication::ReadThread (void *p) { Communication *comm = (Communication *)p; Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_COMMUNICATION); if (log) log->Printf ("%p Communication::ReadThread () thread starting...", p); uint8_t buf[1024]; Error error; ConnectionStatus status = eConnectionStatusSuccess; bool done = false; while (!done && comm->m_read_thread_enabled) { status = comm->BytesAvailable (UINT32_MAX, &error); if (status == eConnectionStatusSuccess) { size_t bytes_read = comm->ReadFromConnection (buf, sizeof(buf), status, &error); if (bytes_read > 0) comm->AppendBytesToCache (buf, bytes_read, true); } switch (status) { case eConnectionStatusSuccess: break; case eConnectionStatusNoConnection: // No connection case eConnectionStatusLostConnection: // Lost connection while connected to a valid connection done = true; // Fall through... default: case eConnectionStatusError: // Check GetError() for details case eConnectionStatusTimedOut: // Request timed out error.LogIfError(log, "%p Communication::BytesAvailable () => status = %i", p, status); break; } } if (log) log->Printf ("%p Communication::ReadThread () thread exiting...", p); // Let clients know that this thread is exiting comm->m_read_thread = LLDB_INVALID_HOST_THREAD; comm->BroadcastEvent (eBroadcastBitReadThreadDidExit); return NULL; }