[Lldb-commits] GDBRemoteCommunicationClientTest.TestPacketSpeedJSON unit test hanging for anyone else?

Pavel Labath via lldb-commits lldb-commits at lists.llvm.org
Fri Nov 4 05:00:23 PDT 2016


Hi Jason,

Sorry about that. The problem was in the present in the debug builds
only. r285992 should fix it.

pl

On 4 November 2016 at 02:45, Jason Molenda <jmolenda at apple.com> wrote:
> Is anyone else seeing a hang in GDBRemoteCommunicationClientTest.TestPacketSpeedJSON when running the unit tests?  It was a new test added in r285602, it always hangs for me on my system, a macOS 10.12.something machine.  Attaching to it with lldb, it's waiting to get a packet down in
>
> thread #1: tid = 0x62358  com.apple.main-thread
> 0  0x7fffbf8a3f4a libsystem_kernel`__select + 10
> 1  0x000105feb733       lldb-gtest`SelectHelper::Select + 4323  SelectHelper.cpp:221
> 2  0x000105d8c6c5       lldb-gtest`lldb_private::ConnectionFileDescriptor::BytesAvailable + 565  ConnectionFileDescriptorPosix.cpp:594
> 3  0x000105d8be48       lldb-gtest`lldb_private::ConnectionFileDescriptor::Read + 552  ConnectionFileDescriptorPosix.cpp:394
> 4  0x000105378038       lldb-gtest`lldb_private::Communication::Read + 1416  Communication.cpp:164
> 5  0x0001057e82bd       lldb-gtest`lldb_private::process_gdb_remote::GDBRemoteCommunication::WaitForPacketWithTimeoutMicroSecondsNoLock + 381  GDBRemoteCommunication.cpp:355
> 6  0x0001057e7b5c       lldb-gtest`lldb_private::process_gdb_remote::GDBRemoteCommunication::ReadPacket + 204  GDBRemoteCommunication.cpp:286
> 7  0x000105de0636       lldb-gtest`lldb_private::process_gdb_remote::GDBRemoteClientBase::SendPacketAndWaitForResponseNoLock + 502  GDBRemoteClientBase.cpp:191
> 8  0x000105de03fe       lldb-gtest`lldb_private::process_gdb_remote::GDBRemoteClientBase::SendPacketAndWaitForResponse + 430  GDBRemoteClientBase.cpp:179
> 9  0x000105d1e2b3       lldb-gtest`lldb_private::process_gdb_remote::GDBRemoteCommunicationClient::TestPacketSpeed + 1667  GDBRemoteCommunicationClient.cpp:2183
> 10 0x000102a4d29d       lldb-gtest`GDBRemoteCommunicationClientTest_TestPacketSpeedJSON_Test::TestBody + 269  GDBRemoteCommunicationClientTest.cpp:287
>
>
>
> with frame 10 being,
>
> frame #10: 0x0000000102a4d29d lldb-gtest`GDBRemoteCommunicationClientTest_TestPacketSpeedJSON_Test::TestBody(this=0x00007fb687d0d530) + 269 at GDBRemoteCommunicationClientTest.cpp:287
>    284    });
>    285
>    286    StreamString ss;
> -> 287    client.TestPacketSpeed(10, 32, 32, true, ss);
>    288    client.Disconnect();
>    289    server_thread.join();
>    290
>
>
> The most unusual thing I saw in a quick stack crawl is in GDBRemoteCommunication::WaitForPacketWithTimeoutMicroSecondsNoLock where it's being told to wait for 1000000000 microseconds, I think that's 1000 seconds or 16 minutes.  So maybe it would complete if I waited 15 minutes longer than I have been. ;)
The 1000 seconds is the default timeout for a debug build
(GDBRemoteCommunication.cpp:136). Things may behave differently for a
release build, where the timeout is 1, but I don't think that will
make the test pass. I will

>
> I'll try to build this up & test it on my more common external-mac setup at home, but I don't think this one would be impacted by our internal OS installs.
>
>
>> On Oct 31, 2016, at 10:19 AM, Pavel Labath via lldb-commits <lldb-commits at lists.llvm.org> wrote:
>>
>> Author: labath
>> Date: Mon Oct 31 12:19:42 2016
>> New Revision: 285602
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=285602&view=rev
>> Log:
>> Remove usages of TimeValue from gdb-remote process plugin
>>
>> Summary:
>> Most of the changes are very straight-forward, the only tricky part was the
>> "packet speed-test" function, which is very time-heavy. As the function was
>> completely untested, I added a quick unit smoke test for it.
>>
>> Reviewers: clayborg, zturner
>>
>> Subscribers: lldb-commits
>>
>> Differential Revision: https://reviews.llvm.org/D25391
>>
>> Modified:
>>    lldb/trunk/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp
>>    lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteClientBase.cpp
>>    lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp
>>    lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.h
>>    lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp
>>    lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h
>>    lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp
>>    lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
>>    lldb/trunk/unittests/Process/gdb-remote/GDBRemoteCommunicationClientTest.cpp
>>
>> Modified: lldb/trunk/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp
>> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp?rev=285602&r1=285601&r2=285602&view=diff
>> ==============================================================================
>> --- lldb/trunk/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp (original)
>> +++ lldb/trunk/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp Mon Oct 31 12:19:42 2016
>> @@ -445,7 +445,7 @@ Error PlatformRemoteGDBServer::LaunchPro
>>   {
>>     // Scope for the scoped timeout object
>>     process_gdb_remote::GDBRemoteCommunication::ScopedTimeout timeout(
>> -        m_gdb_client, 5);
>> +        m_gdb_client, std::chrono::seconds(5));
>>     arg_packet_err = m_gdb_client.SendArgumentsPacket(launch_info);
>>   }
>>
>>
>> Modified: lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteClientBase.cpp
>> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteClientBase.cpp?rev=285602&r1=285601&r2=285602&view=diff
>> ==============================================================================
>> --- lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteClientBase.cpp (original)
>> +++ lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteClientBase.cpp Mon Oct 31 12:19:42 2016
>> @@ -188,8 +188,11 @@ GDBRemoteClientBase::SendPacketAndWaitFo
>>
>>   const size_t max_response_retries = 3;
>>   for (size_t i = 0; i < max_response_retries; ++i) {
>> -    packet_result =
>> -        ReadPacket(response, GetPacketTimeoutInMicroSeconds(), true);
>> +    packet_result = ReadPacket(
>> +        response, std::chrono::duration_cast<std::chrono::microseconds>(
>> +                      GetPacketTimeout())
>> +                      .count(),
>> +        true);
>>     // Make sure we received a response
>>     if (packet_result != PacketResult::Success)
>>       return packet_result;
>>
>> Modified: lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp
>> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp?rev=285602&r1=285601&r2=285602&view=diff
>> ==============================================================================
>> --- lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp (original)
>> +++ lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp Mon Oct 31 12:19:42 2016
>> @@ -28,7 +28,6 @@
>> #include "lldb/Host/Socket.h"
>> #include "lldb/Host/StringConvert.h"
>> #include "lldb/Host/ThreadLauncher.h"
>> -#include "lldb/Host/TimeValue.h"
>> #include "lldb/Target/Platform.h"
>> #include "lldb/Target/Process.h"
>> #include "llvm/ADT/SmallString.h"
>> @@ -262,8 +261,11 @@ GDBRemoteCommunication::SendPacketNoLock
>>
>> GDBRemoteCommunication::PacketResult GDBRemoteCommunication::GetAck() {
>>   StringExtractorGDBRemote packet;
>> -  PacketResult result =
>> -      ReadPacket(packet, GetPacketTimeoutInMicroSeconds(), false);
>> +  PacketResult result = ReadPacket(
>> +      packet,
>> +      std::chrono::duration_cast<std::chrono::microseconds>(GetPacketTimeout())
>> +          .count(),
>> +      false);
>>   if (result == PacketResult::Success) {
>>     if (packet.GetResponseType() ==
>>         StringExtractorGDBRemote::ResponseType::eAck)
>> @@ -1320,7 +1322,7 @@ Error GDBRemoteCommunication::StartDebug
>> void GDBRemoteCommunication::DumpHistory(Stream &strm) { m_history.Dump(strm); }
>>
>> GDBRemoteCommunication::ScopedTimeout::ScopedTimeout(
>> -    GDBRemoteCommunication &gdb_comm, uint32_t timeout)
>> +    GDBRemoteCommunication &gdb_comm, std::chrono::seconds timeout)
>>     : m_gdb_comm(gdb_comm) {
>>   m_saved_timeout = m_gdb_comm.SetPacketTimeout(timeout);
>> }
>>
>> Modified: lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.h
>> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.h?rev=285602&r1=285601&r2=285602&view=diff
>> ==============================================================================
>> --- lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.h (original)
>> +++ lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.h Mon Oct 31 12:19:42 2016
>> @@ -24,7 +24,6 @@
>> #include "lldb/Core/Listener.h"
>> #include "lldb/Host/HostThread.h"
>> #include "lldb/Host/Predicate.h"
>> -#include "lldb/Host/TimeValue.h"
>> #include "lldb/Interpreter/Args.h"
>> #include "lldb/lldb-public.h"
>>
>> @@ -83,12 +82,13 @@ public:
>>   // created ScopedTimeout object got out of scope
>>   class ScopedTimeout {
>>   public:
>> -    ScopedTimeout(GDBRemoteCommunication &gdb_comm, uint32_t timeout);
>> +    ScopedTimeout(GDBRemoteCommunication &gdb_comm,
>> +                  std::chrono::seconds timeout);
>>     ~ScopedTimeout();
>>
>>   private:
>>     GDBRemoteCommunication &m_gdb_comm;
>> -    uint32_t m_saved_timeout;
>> +    std::chrono::seconds m_saved_timeout;
>>   };
>>
>>   GDBRemoteCommunication(const char *comm_name, const char *listener_name);
>> @@ -112,19 +112,16 @@ public:
>>   // Set the global packet timeout.
>>   //
>>   // For clients, this is the timeout that gets used when sending
>> -  // packets and waiting for responses. For servers, this might not
>> -  // get used, and if it doesn't this should be moved to the
>> -  // GDBRemoteCommunicationClient.
>> +  // packets and waiting for responses. For servers, this is used when waiting
>> +  // for ACKs.
>>   //------------------------------------------------------------------
>> -  uint32_t SetPacketTimeout(uint32_t packet_timeout) {
>> -    const uint32_t old_packet_timeout = m_packet_timeout;
>> +  std::chrono::seconds SetPacketTimeout(std::chrono::seconds packet_timeout) {
>> +    const auto old_packet_timeout = m_packet_timeout;
>>     m_packet_timeout = packet_timeout;
>>     return old_packet_timeout;
>>   }
>>
>> -  uint32_t GetPacketTimeoutInMicroSeconds() const {
>> -    return m_packet_timeout * TimeValue::MicroSecPerSec;
>> -  }
>> +  std::chrono::seconds GetPacketTimeout() const { return m_packet_timeout; }
>>
>>   //------------------------------------------------------------------
>>   // Start a debugserver instance on the current host using the
>> @@ -215,7 +212,7 @@ protected:
>>     mutable bool m_dumped_to_log;
>>   };
>>
>> -  uint32_t m_packet_timeout;
>> +  std::chrono::seconds m_packet_timeout;
>>   uint32_t m_echo_number;
>>   LazyBool m_supports_qEcho;
>>   History m_history;
>>
>> Modified: lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp
>> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp?rev=285602&r1=285601&r2=285602&view=diff
>> ==============================================================================
>> --- lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp (original)
>> +++ lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp Mon Oct 31 12:19:42 2016
>> @@ -26,7 +26,6 @@
>> #include "lldb/Core/StreamString.h"
>> #include "lldb/Host/HostInfo.h"
>> #include "lldb/Host/StringConvert.h"
>> -#include "lldb/Host/TimeValue.h"
>> #include "lldb/Interpreter/Args.h"
>> #include "lldb/Symbol/Symbol.h"
>> #include "lldb/Target/MemoryRegionInfo.h"
>> @@ -203,11 +202,8 @@ bool GDBRemoteCommunicationClient::Query
>>     // longer than normal to receive a reply.  Wait at least 6 seconds for a
>>     // reply to this packet.
>>
>> -    const uint32_t minimum_timeout = 6;
>> -    uint32_t old_timeout = GetPacketTimeoutInMicroSeconds() /
>> -                           lldb_private::TimeValue::MicroSecPerSec;
>> -    GDBRemoteCommunication::ScopedTimeout timeout(
>> -        *this, std::max(old_timeout, minimum_timeout));
>> +    ScopedTimeout timeout(
>> +        *this, std::max(GetPacketTimeout(), std::chrono::seconds(6)));
>>
>>     StringExtractorGDBRemote response;
>>     if (SendPacketAndWaitForResponse("QStartNoAckMode", response, false) ==
>> @@ -319,7 +315,7 @@ void GDBRemoteCommunicationClient::Reset
>>     m_hostname.clear();
>>     m_gdb_server_name.clear();
>>     m_gdb_server_version = UINT32_MAX;
>> -    m_default_packet_timeout = 0;
>> +    m_default_packet_timeout = std::chrono::seconds(0);
>>     m_max_packet_size = 0;
>>     m_qSupported_response.clear();
>>     m_supported_async_json_packets_is_valid = false;
>> @@ -1202,7 +1198,9 @@ bool GDBRemoteCommunicationClient::GetHo
>>             if (m_watchpoints_trigger_after_instruction != eLazyBoolCalculate)
>>               ++num_keys_decoded;
>>           } else if (name.equals("default_packet_timeout")) {
>> -            if (!value.getAsInteger(0, m_default_packet_timeout)) {
>> +            uint32_t timeout_seconds;
>> +            if (!value.getAsInteger(0, timeout_seconds)) {
>> +              m_default_packet_timeout = std::chrono::seconds(timeout_seconds);
>>               SetPacketTimeout(m_default_packet_timeout);
>>               ++num_keys_decoded;
>>             }
>> @@ -1331,7 +1329,8 @@ GDBRemoteCommunicationClient::GetHostArc
>>   return m_host_arch;
>> }
>>
>> -uint32_t GDBRemoteCommunicationClient::GetHostDefaultPacketTimeout() {
>> +std::chrono::seconds
>> +GDBRemoteCommunicationClient::GetHostDefaultPacketTimeout() {
>>   if (m_qHostInfo_is_valid == eLazyBoolCalculate)
>>     GetHostInfo();
>>   return m_default_packet_timeout;
>> @@ -2023,7 +2022,7 @@ uint32_t GDBRemoteCommunicationClient::F
>>     StringExtractorGDBRemote response;
>>     // Increase timeout as the first qfProcessInfo packet takes a long time
>>     // on Android. The value of 1min was arrived at empirically.
>> -    GDBRemoteCommunication::ScopedTimeout timeout(*this, 60);
>> +    ScopedTimeout timeout(*this, std::chrono::seconds(60));
>>     if (SendPacketAndWaitForResponse(packet.GetString(), response, false) ==
>>         PacketResult::Success) {
>>       do {
>> @@ -2133,26 +2132,27 @@ static void MakeSpeedTestPacket(StreamSt
>>   }
>> }
>>
>> -template <typename T> T calculate_standard_deviation(const std::vector<T> &v) {
>> -  T sum = std::accumulate(std::begin(v), std::end(v), T(0));
>> -  T mean = sum / (T)v.size();
>> -  T accum = T(0);
>> -  std::for_each(std::begin(v), std::end(v), [&](const T d) {
>> -    T delta = d - mean;
>> +std::chrono::duration<float> calculate_standard_deviation(
>> +    const std::vector<std::chrono::duration<float>> &v) {
>> +  using Dur = std::chrono::duration<float>;
>> +  Dur sum = std::accumulate(std::begin(v), std::end(v), Dur());
>> +  Dur mean = sum / v.size();
>> +  float accum = 0;
>> +  for (auto d : v) {
>> +    float delta = (d - mean).count();
>>     accum += delta * delta;
>> -  });
>> +  };
>>
>> -  T stdev = sqrt(accum / (v.size() - 1));
>> -  return stdev;
>> +  return Dur(sqrtf(accum / (v.size() - 1)));
>> }
>>
>> void GDBRemoteCommunicationClient::TestPacketSpeed(const uint32_t num_packets,
>>                                                    uint32_t max_send,
>>                                                    uint32_t max_recv, bool json,
>>                                                    Stream &strm) {
>> +  using namespace std::chrono;
>> +
>>   uint32_t i;
>> -  TimeValue start_time, end_time;
>> -  uint64_t total_time_nsec;
>>   if (SendSpeedTestPacket(0, 0)) {
>>     StreamString packet;
>>     if (json)
>> @@ -2166,7 +2166,7 @@ void GDBRemoteCommunicationClient::TestP
>>
>>     uint32_t result_idx = 0;
>>     uint32_t send_size;
>> -    std::vector<float> packet_times;
>> +    std::vector<duration<float>> packet_times;
>>
>>     for (send_size = 0; send_size <= max_send;
>>          send_size ? send_size *= 2 : send_size = 4) {
>> @@ -2176,46 +2176,40 @@ void GDBRemoteCommunicationClient::TestP
>>
>>         packet_times.clear();
>>         // Test how long it takes to send 'num_packets' packets
>> -        start_time = TimeValue::Now();
>> +        const auto start_time = steady_clock::now();
>>         for (i = 0; i < num_packets; ++i) {
>> -          TimeValue packet_start_time = TimeValue::Now();
>> +          const auto packet_start_time = steady_clock::now();
>>           StringExtractorGDBRemote response;
>>           SendPacketAndWaitForResponse(packet.GetString(), response, false);
>> -          TimeValue packet_end_time = TimeValue::Now();
>> -          uint64_t packet_time_nsec =
>> -              packet_end_time.GetAsNanoSecondsSinceJan1_1970() -
>> -              packet_start_time.GetAsNanoSecondsSinceJan1_1970();
>> -          packet_times.push_back((float)packet_time_nsec);
>> -        }
>> -        end_time = TimeValue::Now();
>> -        total_time_nsec = end_time.GetAsNanoSecondsSinceJan1_1970() -
>> -                          start_time.GetAsNanoSecondsSinceJan1_1970();
>> +          const auto packet_end_time = steady_clock::now();
>> +          packet_times.push_back(packet_end_time - packet_start_time);
>> +        }
>> +        const auto end_time = steady_clock::now();
>> +        const auto total_time = end_time - start_time;
>>
>>         float packets_per_second =
>> -            (((float)num_packets) / (float)total_time_nsec) *
>> -            (float)TimeValue::NanoSecPerSec;
>> -        float total_ms =
>> -            (float)total_time_nsec / (float)TimeValue::NanoSecPerMilliSec;
>> -        float average_ms_per_packet = total_ms / num_packets;
>> -        const float standard_deviation =
>> -            calculate_standard_deviation<float>(packet_times);
>> +            ((float)num_packets) / duration<float>(total_time).count();
>> +        auto average_per_packet = total_time / num_packets;
>> +        const duration<float> standard_deviation =
>> +            calculate_standard_deviation(packet_times);
>>         if (json) {
>>           strm.Printf("%s\n     {\"send_size\" : %6" PRIu32
>>                       ", \"recv_size\" : %6" PRIu32
>>                       ", \"total_time_nsec\" : %12" PRIu64
>>                       ", \"standard_deviation_nsec\" : %9" PRIu64 " }",
>>                       result_idx > 0 ? "," : "", send_size, recv_size,
>> -                      total_time_nsec, (uint64_t)standard_deviation);
>> +                      duration_cast<nanoseconds>(total_time).count(),
>> +                      duration_cast<nanoseconds>(standard_deviation).count());
>>           ++result_idx;
>>         } else {
>>           strm.Printf(
>> -              "qSpeedTest(send=%-7u, recv=%-7u) in %" PRIu64 ".%9.9" PRIu64
>> +              "qSpeedTest(send=%-7u, recv=%-7u) in %.9f"
>>               " sec for %9.2f packets/sec (%10.6f ms per packet) with standard "
>>               "deviation of %10.6f ms\n",
>> -              send_size, recv_size, total_time_nsec / TimeValue::NanoSecPerSec,
>> -              total_time_nsec % TimeValue::NanoSecPerSec, packets_per_second,
>> -              average_ms_per_packet,
>> -              standard_deviation / (float)TimeValue::NanoSecPerMilliSec);
>> +              send_size, recv_size, duration<float>(total_time).count(),
>> +              packets_per_second,
>> +              duration<float, std::milli>(average_per_packet).count(),
>> +              duration<float, std::milli>(standard_deviation).count());
>>         }
>>         strm.Flush();
>>       }
>> @@ -2241,7 +2235,7 @@ void GDBRemoteCommunicationClient::TestP
>>       // If we have a receive size, test how long it takes to receive 4MB of
>>       // data
>>       if (recv_size > 0) {
>> -        start_time = TimeValue::Now();
>> +        const auto start_time = steady_clock::now();
>>         uint32_t bytes_read = 0;
>>         uint32_t packet_count = 0;
>>         while (bytes_read < k_recv_amount) {
>> @@ -2250,35 +2244,31 @@ void GDBRemoteCommunicationClient::TestP
>>           bytes_read += recv_size;
>>           ++packet_count;
>>         }
>> -        end_time = TimeValue::Now();
>> -        total_time_nsec = end_time.GetAsNanoSecondsSinceJan1_1970() -
>> -                          start_time.GetAsNanoSecondsSinceJan1_1970();
>> -        float mb_second = ((((float)k_recv_amount) / (float)total_time_nsec) *
>> -                           (float)TimeValue::NanoSecPerSec) /
>> +        const auto end_time = steady_clock::now();
>> +        const auto total_time = end_time - start_time;
>> +        float mb_second = ((float)k_recv_amount) /
>> +                          duration<float>(total_time).count() /
>>                           (1024.0 * 1024.0);
>>         float packets_per_second =
>> -            (((float)packet_count) / (float)total_time_nsec) *
>> -            (float)TimeValue::NanoSecPerSec;
>> -        float total_ms =
>> -            (float)total_time_nsec / (float)TimeValue::NanoSecPerMilliSec;
>> -        float average_ms_per_packet = total_ms / packet_count;
>> +            ((float)packet_count) / duration<float>(total_time).count();
>> +        const auto average_per_packet = total_time / packet_count;
>>
>>         if (json) {
>>           strm.Printf("%s\n     {\"send_size\" : %6" PRIu32
>>                       ", \"recv_size\" : %6" PRIu32
>>                       ", \"total_time_nsec\" : %12" PRIu64 " }",
>>                       result_idx > 0 ? "," : "", send_size, recv_size,
>> -                      total_time_nsec);
>> +                      duration_cast<nanoseconds>(total_time).count());
>>           ++result_idx;
>>         } else {
>>           strm.Printf("qSpeedTest(send=%-7u, recv=%-7u) %6u packets needed to "
>> -                      "receive %2.1fMB in %" PRIu64 ".%9.9" PRIu64
>> +                      "receive %2.1fMB in %.9f"
>>                       " sec for %f MB/sec for %9.2f packets/sec (%10.6f ms per "
>>                       "packet)\n",
>>                       send_size, recv_size, packet_count, k_recv_amount_mb,
>> -                      total_time_nsec / TimeValue::NanoSecPerSec,
>> -                      total_time_nsec % TimeValue::NanoSecPerSec, mb_second,
>> -                      packets_per_second, average_ms_per_packet);
>> +                      duration<float>(total_time).count(), mb_second,
>> +                      packets_per_second,
>> +                      duration<float, std::milli>(average_per_packet).count());
>>         }
>>         strm.Flush();
>>       }
>> @@ -2335,7 +2325,7 @@ bool GDBRemoteCommunicationClient::Launc
>>     }
>>   }
>>   // give the process a few seconds to startup
>> -  GDBRemoteCommunication::ScopedTimeout timeout(*this, 10);
>> +  ScopedTimeout timeout(*this, std::chrono::seconds(10));
>>
>>   if (SendPacketAndWaitForResponse(stream.GetString(), response, false) ==
>>       PacketResult::Success) {
>>
>> Modified: lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h
>> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h?rev=285602&r1=285601&r2=285602&view=diff
>> ==============================================================================
>> --- lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h (original)
>> +++ lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h Mon Oct 31 12:19:42 2016
>> @@ -244,7 +244,7 @@ public:
>>
>>   const ArchSpec &GetHostArchitecture();
>>
>> -  uint32_t GetHostDefaultPacketTimeout();
>> +  std::chrono::seconds GetHostDefaultPacketTimeout();
>>
>>   const ArchSpec &GetProcessArchitecture();
>>
>> @@ -556,7 +556,7 @@ protected:
>>                                  // qGDBServerVersion is not supported
>>   uint32_t m_gdb_server_version; // from reply to qGDBServerVersion, zero if
>>                                  // qGDBServerVersion is not supported
>> -  uint32_t m_default_packet_timeout;
>> +  std::chrono::seconds m_default_packet_timeout;
>>   uint64_t m_max_packet_size;        // as returned by qSupported
>>   std::string m_qSupported_response; // the complete response to qSupported
>>
>>
>> Modified: lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp
>> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp?rev=285602&r1=285601&r2=285602&view=diff
>> ==============================================================================
>> --- lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp (original)
>> +++ lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp Mon Oct 31 12:19:42 2016
>> @@ -34,7 +34,6 @@
>> #include "lldb/Host/Host.h"
>> #include "lldb/Host/HostInfo.h"
>> #include "lldb/Host/StringConvert.h"
>> -#include "lldb/Host/TimeValue.h"
>> #include "lldb/Host/common/NativeProcessProtocol.h"
>> #include "lldb/Host/common/NativeRegisterContext.h"
>> #include "lldb/Host/common/NativeThreadProtocol.h"
>>
>> Modified: lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
>> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp?rev=285602&r1=285601&r2=285602&view=diff
>> ==============================================================================
>> --- lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp (original)
>> +++ lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp Mon Oct 31 12:19:42 2016
>> @@ -46,7 +46,6 @@
>> #include "lldb/Host/StringConvert.h"
>> #include "lldb/Host/Symbols.h"
>> #include "lldb/Host/ThreadLauncher.h"
>> -#include "lldb/Host/TimeValue.h"
>> #include "lldb/Host/XML.h"
>> #include "lldb/Interpreter/Args.h"
>> #include "lldb/Interpreter/CommandInterpreter.h"
>> @@ -289,7 +288,7 @@ ProcessGDBRemote::ProcessGDBRemote(lldb:
>>   const uint64_t timeout_seconds =
>>       GetGlobalPluginProperties()->GetPacketTimeout();
>>   if (timeout_seconds > 0)
>> -    m_gdb_comm.SetPacketTimeout(timeout_seconds);
>> +    m_gdb_comm.SetPacketTimeout(std::chrono::seconds(timeout_seconds));
>> }
>>
>> //----------------------------------------------------------------------
>> @@ -424,9 +423,9 @@ void ProcessGDBRemote::BuildDynamicRegis
>>   // Check if qHostInfo specified a specific packet timeout for this connection.
>>   // If so then lets update our setting so the user knows what the timeout is
>>   // and can see it.
>> -  const uint32_t host_packet_timeout = m_gdb_comm.GetHostDefaultPacketTimeout();
>> -  if (host_packet_timeout) {
>> -    GetGlobalPluginProperties()->SetPacketTimeout(host_packet_timeout);
>> +  const auto host_packet_timeout = m_gdb_comm.GetHostDefaultPacketTimeout();
>> +  if (host_packet_timeout > std::chrono::seconds(0)) {
>> +    GetGlobalPluginProperties()->SetPacketTimeout(host_packet_timeout.count());
>>   }
>>
>>   // Register info search order:
>> @@ -899,7 +898,8 @@ Error ProcessGDBRemote::DoLaunch(Module
>>
>>       {
>>         // Scope for the scoped timeout object
>> -        GDBRemoteCommunication::ScopedTimeout timeout(m_gdb_comm, 10);
>> +        GDBRemoteCommunication::ScopedTimeout timeout(m_gdb_comm,
>> +                                                      std::chrono::seconds(10));
>>
>>         int arg_packet_err = m_gdb_comm.SendArgumentsPacket(launch_info);
>>         if (arg_packet_err == 0) {
>> @@ -2573,7 +2573,8 @@ Error ProcessGDBRemote::DoDestroy() {
>>     if (m_public_state.GetValue() != eStateAttaching) {
>>       StringExtractorGDBRemote response;
>>       bool send_async = true;
>> -      GDBRemoteCommunication::ScopedTimeout(m_gdb_comm, 3);
>> +      GDBRemoteCommunication::ScopedTimeout(m_gdb_comm,
>> +                                            std::chrono::seconds(3));
>>
>>       if (m_gdb_comm.SendPacketAndWaitForResponse("k", response, send_async) ==
>>           GDBRemoteCommunication::PacketResult::Success) {
>> @@ -3894,7 +3895,8 @@ ProcessGDBRemote::GetLoadedDynamicLibrar
>>
>>   if (m_gdb_comm.GetLoadedDynamicLibrariesInfosSupported()) {
>>     // Scope for the scoped timeout object
>> -    GDBRemoteCommunication::ScopedTimeout timeout(m_gdb_comm, 10);
>> +    GDBRemoteCommunication::ScopedTimeout timeout(m_gdb_comm,
>> +                                                  std::chrono::seconds(10));
>>
>>     StreamString packet;
>>     packet << "jGetLoadedDynamicLibrariesInfos:";
>>
>> Modified: lldb/trunk/unittests/Process/gdb-remote/GDBRemoteCommunicationClientTest.cpp
>> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/unittests/Process/gdb-remote/GDBRemoteCommunicationClientTest.cpp?rev=285602&r1=285601&r2=285602&view=diff
>> ==============================================================================
>> --- lldb/trunk/unittests/Process/gdb-remote/GDBRemoteCommunicationClientTest.cpp (original)
>> +++ lldb/trunk/unittests/Process/gdb-remote/GDBRemoteCommunicationClientTest.cpp Mon Oct 31 12:19:42 2016
>> @@ -20,12 +20,14 @@
>> #include "Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h"
>> #include "lldb/Core/DataBuffer.h"
>> #include "lldb/Core/ModuleSpec.h"
>> +#include "lldb/Core/StructuredData.h"
>>
>> #include "llvm/ADT/ArrayRef.h"
>>
>> using namespace lldb_private::process_gdb_remote;
>> using namespace lldb_private;
>> using namespace lldb;
>> +using namespace llvm;
>>
>> namespace {
>>
>> @@ -45,8 +47,7 @@ void Handle_QThreadSuffixSupported(MockS
>>     ASSERT_EQ(PacketResult::Success, server.SendUnimplementedResponse(nullptr));
>> }
>>
>> -void HandlePacket(MockServer &server, llvm::StringRef expected,
>> -                  llvm::StringRef response) {
>> +void HandlePacket(MockServer &server, StringRef expected, StringRef response) {
>>   StringExtractorGDBRemote request;
>>   ASSERT_EQ(PacketResult::Success, server.GetPacket(request));
>>   ASSERT_EQ(expected, request.GetStringRef());
>> @@ -260,3 +261,45 @@ TEST_F(GDBRemoteCommunicationClientTest,
>>     ASSERT_FALSE(async_result.get().hasValue()) << "response was: " << response;
>>   }
>> }
>> +
>> +TEST_F(GDBRemoteCommunicationClientTest, TestPacketSpeedJSON) {
>> +  TestClient client;
>> +  MockServer server;
>> +  Connect(client, server);
>> +  if (HasFailure())
>> +    return;
>> +
>> +  std::thread server_thread([&server] {
>> +    StringExtractorGDBRemote request;
>> +    PacketResult result = server.GetPacket(request);
>> +    if (result == PacketResult::ErrorDisconnected)
>> +      return;
>> +    ASSERT_EQ(PacketResult::Success, result);
>> +    StringRef ref = request.GetStringRef();
>> +    ASSERT_TRUE(ref.consume_front("qSpeedTest:response_size:"));
>> +    int size;
>> +    ASSERT_FALSE(ref.consumeInteger(10, size)) << "ref: " << ref;
>> +    std::string response(size, 'X');
>> +    ASSERT_EQ(PacketResult::Success, server.SendPacket(response));
>> +  });
>> +
>> +  StreamString ss;
>> +  client.TestPacketSpeed(10, 32, 32, true, ss);
>> +  client.Disconnect();
>> +  server_thread.join();
>> +
>> +  auto object_sp = StructuredData::ParseJSON(ss.GetString());
>> +  ASSERT_TRUE(bool(object_sp));
>> +  auto dict_sp = object_sp->GetAsDictionary();
>> +  ASSERT_TRUE(bool(dict_sp));
>> +
>> +  object_sp = dict_sp->GetValueForKey("packet_speeds");
>> +  ASSERT_TRUE(bool(object_sp));
>> +  dict_sp = object_sp->GetAsDictionary();
>> +  ASSERT_TRUE(bool(dict_sp));
>> +
>> +  int num_packets;
>> +  ASSERT_TRUE(dict_sp->GetValueForKeyAsInteger("num_packets", num_packets))
>> +      << ss.GetString();
>> +  ASSERT_EQ(10, num_packets);
>> +}
>>
>>
>> _______________________________________________
>> lldb-commits mailing list
>> lldb-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
>


More information about the lldb-commits mailing list