diff options
Diffstat (limited to 'lldb/source/Plugins/Process/gdb-remote')
4 files changed, 48 insertions, 27 deletions
diff --git a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp index ecf581b2fab..62bc3627f69 100644 --- a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp @@ -926,3 +926,15 @@ GDBRemoteCommunication::DumpHistory(Stream &strm) { m_history.Dump (strm); } + +GDBRemoteCommunication::ScopedTimeout::ScopedTimeout (GDBRemoteCommunication& gdb_comm, + uint32_t timeout) : + m_gdb_comm (gdb_comm) +{ + m_saved_timeout = m_gdb_comm.SetPacketTimeout (timeout); +} + +GDBRemoteCommunication::ScopedTimeout::~ScopedTimeout () +{ + m_gdb_comm.SetPacketTimeout (m_saved_timeout); +} diff --git a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.h b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.h index 552d8914e3e..b704df3b72f 100644 --- a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.h +++ b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.h @@ -59,6 +59,20 @@ public: ErrorDisconnected, // We were disconnected ErrorNoSequenceLock // We couldn't get the sequence lock for a multi-packet request }; + + // Class to change the timeout for a given scope and restore it to the original value when the + // created ScopedTimeout object got out of scope + class ScopedTimeout + { + public: + ScopedTimeout (GDBRemoteCommunication& gdb_comm, uint32_t timeout); + ~ScopedTimeout (); + + private: + GDBRemoteCommunication& m_gdb_comm; + uint32_t m_saved_timeout; + }; + //------------------------------------------------------------------ // Constructors and Destructors //------------------------------------------------------------------ diff --git a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp index c1951e42694..f5cf2a52574 100644 --- a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp @@ -234,13 +234,10 @@ GDBRemoteCommunicationClient::QueryNoAckModeSupported () const uint32_t minimum_timeout = 6; uint32_t old_timeout = GetPacketTimeoutInMicroSeconds() / lldb_private::TimeValue::MicroSecPerSec; - SetPacketTimeout (std::max (old_timeout, minimum_timeout)); + GDBRemoteCommunication::ScopedTimeout timeout (*this, std::max (old_timeout, minimum_timeout)); StringExtractorGDBRemote response; - PacketResult packet_send_result = SendPacketAndWaitForResponse("QStartNoAckMode", response, false); - SetPacketTimeout (old_timeout); - - if (packet_send_result == PacketResult::Success) + if (SendPacketAndWaitForResponse("QStartNoAckMode", response, false) == PacketResult::Success) { if (response.IsOKResponse()) { @@ -2869,10 +2866,9 @@ GDBRemoteCommunicationClient::LaunchGDBserverAndGetPort (lldb::pid_t &pid, const int packet_len = stream.GetSize(); // give the process a few seconds to startup - const uint32_t old_packet_timeout = SetPacketTimeout (10); - auto result = SendPacketAndWaitForResponse(packet, packet_len, response, false); - SetPacketTimeout (old_packet_timeout); - if (result == PacketResult::Success) + GDBRemoteCommunication::ScopedTimeout timeout (*this, 10); + + if (SendPacketAndWaitForResponse(packet, packet_len, response, false) == PacketResult::Success) { std::string name; std::string value; diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp index 88b94cc100d..d3c9e84b5e5 100644 --- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp @@ -904,27 +904,29 @@ ProcessGDBRemote::DoLaunch (Module *exe_module, ProcessLaunchInfo &launch_info) } } - const uint32_t old_packet_timeout = m_gdb_comm.SetPacketTimeout (10); - int arg_packet_err = m_gdb_comm.SendArgumentsPacket (launch_info); - if (arg_packet_err == 0) { - std::string error_str; - if (m_gdb_comm.GetLaunchSuccess (error_str)) + // Scope for the scoped timeout object + GDBRemoteCommunication::ScopedTimeout timeout (m_gdb_comm, 10); + + int arg_packet_err = m_gdb_comm.SendArgumentsPacket (launch_info); + if (arg_packet_err == 0) { - SetID (m_gdb_comm.GetCurrentProcessID ()); + std::string error_str; + if (m_gdb_comm.GetLaunchSuccess (error_str)) + { + SetID (m_gdb_comm.GetCurrentProcessID ()); + } + else + { + error.SetErrorString (error_str.c_str()); + } } else { - error.SetErrorString (error_str.c_str()); + error.SetErrorStringWithFormat("'A' packet returned an error: %i", arg_packet_err); } } - else - { - error.SetErrorStringWithFormat("'A' packet returned an error: %i", arg_packet_err); - } - - m_gdb_comm.SetPacketTimeout (old_packet_timeout); - + if (GetID() == LLDB_INVALID_PROCESS_ID) { if (log) @@ -2158,10 +2160,9 @@ ProcessGDBRemote::DoDestroy () { if (m_public_state.GetValue() != eStateAttaching) { - StringExtractorGDBRemote response; bool send_async = true; - const uint32_t old_packet_timeout = m_gdb_comm.SetPacketTimeout (3); + GDBRemoteCommunication::ScopedTimeout (m_gdb_comm, 3); if (m_gdb_comm.SendPacketAndWaitForResponse("k", 1, response, send_async) == GDBRemoteCommunication::PacketResult::Success) { @@ -2205,8 +2206,6 @@ ProcessGDBRemote::DoDestroy () log->Printf ("ProcessGDBRemote::DoDestroy - failed to send k packet"); exit_string.assign("failed to send the k packet"); } - - m_gdb_comm.SetPacketTimeout(old_packet_timeout); } else { |