1 //===-- GDBRemoteCommunicationHistory.h--------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTECOMMUNICATIONHISTORY_H 10 #define LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTECOMMUNICATIONHISTORY_H 11 12 #include <string> 13 #include <vector> 14 15 #include "lldb/Utility/GDBRemote.h" 16 #include "lldb/lldb-public.h" 17 #include "llvm/Support/raw_ostream.h" 18 19 namespace lldb_private { 20 namespace process_gdb_remote { 21 22 /// The history keeps a circular buffer of GDB remote packets. The history is 23 /// used for logging and replaying GDB remote packets. 24 class GDBRemoteCommunicationHistory { 25 public: 26 GDBRemoteCommunicationHistory(uint32_t size = 0); 27 28 ~GDBRemoteCommunicationHistory(); 29 30 // For single char packets for ack, nack and /x03 31 void AddPacket(char packet_char, GDBRemotePacket::Type type, 32 uint32_t bytes_transmitted); 33 34 void AddPacket(const std::string &src, uint32_t src_len, 35 GDBRemotePacket::Type type, uint32_t bytes_transmitted); 36 37 void Dump(Stream &strm) const; 38 void Dump(Log *log) const; DidDumpToLog()39 bool DidDumpToLog() const { return m_dumped_to_log; } 40 41 private: GetFirstSavedPacketIndex()42 uint32_t GetFirstSavedPacketIndex() const { 43 if (m_total_packet_count < m_packets.size()) 44 return 0; 45 else 46 return m_curr_idx + 1; 47 } 48 GetNumPacketsInHistory()49 uint32_t GetNumPacketsInHistory() const { 50 if (m_total_packet_count < m_packets.size()) 51 return m_total_packet_count; 52 else 53 return (uint32_t)m_packets.size(); 54 } 55 GetNextIndex()56 uint32_t GetNextIndex() { 57 ++m_total_packet_count; 58 const uint32_t idx = m_curr_idx; 59 m_curr_idx = NormalizeIndex(idx + 1); 60 return idx; 61 } 62 NormalizeIndex(uint32_t i)63 uint32_t NormalizeIndex(uint32_t i) const { 64 return m_packets.empty() ? 0 : i % m_packets.size(); 65 } 66 67 std::vector<GDBRemotePacket> m_packets; 68 uint32_t m_curr_idx = 0; 69 uint32_t m_total_packet_count = 0; 70 mutable bool m_dumped_to_log = false; 71 }; 72 73 } // namespace process_gdb_remote 74 } // namespace lldb_private 75 76 #endif // LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTECOMMUNICATIONHISTORY_H 77