GDBRemoteCommunication::PacketResult GDBRemoteCommunicationServer::GetPacketAndSendResponse (uint32_t timeout_usec, Error &error, bool &interrupt, bool &quit) { StringExtractorGDBRemote packet; PacketResult packet_result = WaitForPacketWithTimeoutMicroSecondsNoLock (packet, timeout_usec, false); if (packet_result == PacketResult::Success) { const StringExtractorGDBRemote::ServerPacketType packet_type = packet.GetServerPacketType (); switch (packet_type) { case StringExtractorGDBRemote::eServerPacketType_nack: case StringExtractorGDBRemote::eServerPacketType_ack: break; case StringExtractorGDBRemote::eServerPacketType_invalid: error.SetErrorString("invalid packet"); quit = true; break; case StringExtractorGDBRemote::eServerPacketType_unimplemented: packet_result = SendUnimplementedResponse (packet.GetStringRef().c_str()); break; default: auto handler_it = m_packet_handlers.find(packet_type); if (handler_it == m_packet_handlers.end()) packet_result = SendUnimplementedResponse (packet.GetStringRef().c_str()); else packet_result = handler_it->second (packet, error, interrupt, quit); break; } } else { if (!IsConnected()) { error.SetErrorString("lost connection"); quit = true; } else { error.SetErrorString("timeout"); } } // Check if anything occurred that would force us to want to exit. if (m_exit_now) quit = true; return packet_result; }
//void * //GDBRemoteCommunicationServer::AsyncThread (void *arg) //{ // GDBRemoteCommunicationServer *server = (GDBRemoteCommunicationServer*) arg; // // Log *log;// (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS)); // if (log) // log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %i) thread starting...", __FUNCTION__, arg, process->GetID()); // // StringExtractorGDBRemote packet; // // while () // { // if (packet. // } // // if (log) // log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %i) thread exiting...", __FUNCTION__, arg, process->GetID()); // // process->m_async_thread = LLDB_INVALID_HOST_THREAD; // return NULL; //} // bool GDBRemoteCommunicationServer::GetPacketAndSendResponse (uint32_t timeout_usec, Error &error, bool &interrupt, bool &quit) { StringExtractorGDBRemote packet; PacketResult packet_result = WaitForPacketWithTimeoutMicroSecondsNoLock (packet, timeout_usec); if (packet_result == PacketResult::Success) { const StringExtractorGDBRemote::ServerPacketType packet_type = packet.GetServerPacketType (); switch (packet_type) { case StringExtractorGDBRemote::eServerPacketType_nack: case StringExtractorGDBRemote::eServerPacketType_ack: break; case StringExtractorGDBRemote::eServerPacketType_invalid: error.SetErrorString("invalid packet"); quit = true; break; case StringExtractorGDBRemote::eServerPacketType_interrupt: error.SetErrorString("interrupt received"); interrupt = true; break; default: case StringExtractorGDBRemote::eServerPacketType_unimplemented: packet_result = SendUnimplementedResponse (packet.GetStringRef().c_str()); break; case StringExtractorGDBRemote::eServerPacketType_A: packet_result = Handle_A (packet); break; case StringExtractorGDBRemote::eServerPacketType_qfProcessInfo: packet_result = Handle_qfProcessInfo (packet); break; case StringExtractorGDBRemote::eServerPacketType_qsProcessInfo: packet_result = Handle_qsProcessInfo (packet); break; case StringExtractorGDBRemote::eServerPacketType_qC: packet_result = Handle_qC (packet); break; case StringExtractorGDBRemote::eServerPacketType_qHostInfo: packet_result = Handle_qHostInfo (packet); break; case StringExtractorGDBRemote::eServerPacketType_qLaunchGDBServer: packet_result = Handle_qLaunchGDBServer (packet); break; case StringExtractorGDBRemote::eServerPacketType_qKillSpawnedProcess: packet_result = Handle_qKillSpawnedProcess (packet); break; case StringExtractorGDBRemote::eServerPacketType_qLaunchSuccess: packet_result = Handle_qLaunchSuccess (packet); break; case StringExtractorGDBRemote::eServerPacketType_qGroupName: packet_result = Handle_qGroupName (packet); break; case StringExtractorGDBRemote::eServerPacketType_qProcessInfoPID: packet_result = Handle_qProcessInfoPID (packet); break; case StringExtractorGDBRemote::eServerPacketType_qSpeedTest: packet_result = Handle_qSpeedTest (packet); break; case StringExtractorGDBRemote::eServerPacketType_qUserName: packet_result = Handle_qUserName (packet); break; case StringExtractorGDBRemote::eServerPacketType_qGetWorkingDir: packet_result = Handle_qGetWorkingDir(packet); break; case StringExtractorGDBRemote::eServerPacketType_QEnvironment: packet_result = Handle_QEnvironment (packet); break; case StringExtractorGDBRemote::eServerPacketType_QLaunchArch: packet_result = Handle_QLaunchArch (packet); break; case StringExtractorGDBRemote::eServerPacketType_QSetDisableASLR: packet_result = Handle_QSetDisableASLR (packet); break; case StringExtractorGDBRemote::eServerPacketType_QSetSTDIN: packet_result = Handle_QSetSTDIN (packet); break; case StringExtractorGDBRemote::eServerPacketType_QSetSTDOUT: packet_result = Handle_QSetSTDOUT (packet); break; case StringExtractorGDBRemote::eServerPacketType_QSetSTDERR: packet_result = Handle_QSetSTDERR (packet); break; case StringExtractorGDBRemote::eServerPacketType_QSetWorkingDir: packet_result = Handle_QSetWorkingDir (packet); break; case StringExtractorGDBRemote::eServerPacketType_QStartNoAckMode: packet_result = Handle_QStartNoAckMode (packet); break; case StringExtractorGDBRemote::eServerPacketType_qPlatform_mkdir: packet_result = Handle_qPlatform_mkdir (packet); break; case StringExtractorGDBRemote::eServerPacketType_qPlatform_chmod: packet_result = Handle_qPlatform_chmod (packet); break; case StringExtractorGDBRemote::eServerPacketType_qPlatform_shell: packet_result = Handle_qPlatform_shell (packet); break; case StringExtractorGDBRemote::eServerPacketType_vFile_open: packet_result = Handle_vFile_Open (packet); break; case StringExtractorGDBRemote::eServerPacketType_vFile_close: packet_result = Handle_vFile_Close (packet); break; case StringExtractorGDBRemote::eServerPacketType_vFile_pread: packet_result = Handle_vFile_pRead (packet); break; case StringExtractorGDBRemote::eServerPacketType_vFile_pwrite: packet_result = Handle_vFile_pWrite (packet); break; case StringExtractorGDBRemote::eServerPacketType_vFile_size: packet_result = Handle_vFile_Size (packet); break; case StringExtractorGDBRemote::eServerPacketType_vFile_mode: packet_result = Handle_vFile_Mode (packet); break; case StringExtractorGDBRemote::eServerPacketType_vFile_exists: packet_result = Handle_vFile_Exists (packet); break; case StringExtractorGDBRemote::eServerPacketType_vFile_stat: packet_result = Handle_vFile_Stat (packet); break; case StringExtractorGDBRemote::eServerPacketType_vFile_md5: packet_result = Handle_vFile_MD5 (packet); break; case StringExtractorGDBRemote::eServerPacketType_vFile_symlink: packet_result = Handle_vFile_symlink (packet); break; case StringExtractorGDBRemote::eServerPacketType_vFile_unlink: packet_result = Handle_vFile_unlink (packet); break; } } else { if (!IsConnected()) { error.SetErrorString("lost connection"); quit = true; } else { error.SetErrorString("timeout"); } } return packet_result == PacketResult::Success; }
//void * //GDBRemoteCommunicationServer::AsyncThread (void *arg) //{ // GDBRemoteCommunicationServer *server = (GDBRemoteCommunicationServer*) arg; // // LogSP log;// (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS)); // if (log) // log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %i) thread starting...", __FUNCTION__, arg, process->GetID()); // // StringExtractorGDBRemote packet; // // while () // { // if (packet. // } // // if (log) // log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %i) thread exiting...", __FUNCTION__, arg, process->GetID()); // // process->m_async_thread = LLDB_INVALID_HOST_THREAD; // return NULL; //} // bool GDBRemoteCommunicationServer::GetPacketAndSendResponse (uint32_t timeout_usec, Error &error, bool &interrupt, bool &quit) { StringExtractorGDBRemote packet; if (WaitForPacketWithTimeoutMicroSeconds(packet, timeout_usec)) { const StringExtractorGDBRemote::ServerPacketType packet_type = packet.GetServerPacketType (); switch (packet_type) { case StringExtractorGDBRemote::eServerPacketType_nack: case StringExtractorGDBRemote::eServerPacketType_ack: break; case StringExtractorGDBRemote::eServerPacketType_invalid: error.SetErrorString("invalid packet"); quit = true; break; case StringExtractorGDBRemote::eServerPacketType_interrupt: error.SetErrorString("interrupt received"); interrupt = true; break; case StringExtractorGDBRemote::eServerPacketType_unimplemented: return SendUnimplementedResponse (packet.GetStringRef().c_str()) > 0; case StringExtractorGDBRemote::eServerPacketType_A: return Handle_A (packet); case StringExtractorGDBRemote::eServerPacketType_qfProcessInfo: return Handle_qfProcessInfo (packet); case StringExtractorGDBRemote::eServerPacketType_qsProcessInfo: return Handle_qsProcessInfo (packet); case StringExtractorGDBRemote::eServerPacketType_qC: return Handle_qC (packet); case StringExtractorGDBRemote::eServerPacketType_qHostInfo: return Handle_qHostInfo (packet); case StringExtractorGDBRemote::eServerPacketType_qLaunchGDBServer: return Handle_qLaunchGDBServer (packet); case StringExtractorGDBRemote::eServerPacketType_qLaunchSuccess: return Handle_qLaunchSuccess (packet); case StringExtractorGDBRemote::eServerPacketType_qGroupName: return Handle_qGroupName (packet); case StringExtractorGDBRemote::eServerPacketType_qProcessInfoPID: return Handle_qProcessInfoPID (packet); case StringExtractorGDBRemote::eServerPacketType_qSpeedTest: return Handle_qSpeedTest (packet); case StringExtractorGDBRemote::eServerPacketType_qUserName: return Handle_qUserName (packet); case StringExtractorGDBRemote::eServerPacketType_QEnvironment: return Handle_QEnvironment (packet); case StringExtractorGDBRemote::eServerPacketType_QSetDisableASLR: return Handle_QSetDisableASLR (packet); case StringExtractorGDBRemote::eServerPacketType_QSetSTDIN: return Handle_QSetSTDIN (packet); case StringExtractorGDBRemote::eServerPacketType_QSetSTDOUT: return Handle_QSetSTDOUT (packet); case StringExtractorGDBRemote::eServerPacketType_QSetSTDERR: return Handle_QSetSTDERR (packet); case StringExtractorGDBRemote::eServerPacketType_QSetWorkingDir: return Handle_QSetWorkingDir (packet); case StringExtractorGDBRemote::eServerPacketType_QStartNoAckMode: return Handle_QStartNoAckMode (packet); } return true; } else { if (!IsConnected()) error.SetErrorString("lost connection"); else error.SetErrorString("timeout"); } return false; }