1 //===-- GDBRemoteCommunicationHistory.h--------------------------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 #ifndef LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTECOMMUNICATIONHISTORY_H
10 #define LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTECOMMUNICATIONHISTORY_H
15 #include "lldb/Utility/GDBRemote.h"
16 #include "lldb/lldb-public.h"
17 #include "llvm/Support/raw_ostream.h"
19 namespace lldb_private
{
20 namespace process_gdb_remote
{
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
{
26 GDBRemoteCommunicationHistory(uint32_t size
= 0);
28 ~GDBRemoteCommunicationHistory();
30 // For single char packets for ack, nack and /x03
31 void AddPacket(char packet_char
, GDBRemotePacket::Type type
,
32 uint32_t bytes_transmitted
);
34 void AddPacket(const std::string
&src
, uint32_t src_len
,
35 GDBRemotePacket::Type type
, uint32_t bytes_transmitted
);
37 void Dump(Stream
&strm
) const;
38 void Dump(Log
*log
) const;
39 bool DidDumpToLog() const { return m_dumped_to_log
; }
42 uint32_t GetFirstSavedPacketIndex() const {
43 if (m_total_packet_count
< m_packets
.size())
46 return m_curr_idx
+ 1;
49 uint32_t GetNumPacketsInHistory() const {
50 if (m_total_packet_count
< m_packets
.size())
51 return m_total_packet_count
;
53 return (uint32_t)m_packets
.size();
56 uint32_t GetNextIndex() {
57 ++m_total_packet_count
;
58 const uint32_t idx
= m_curr_idx
;
59 m_curr_idx
= NormalizeIndex(idx
+ 1);
63 uint32_t NormalizeIndex(uint32_t i
) const {
64 return m_packets
.empty() ? 0 : i
% m_packets
.size();
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;
73 } // namespace process_gdb_remote
74 } // namespace lldb_private
76 #endif // LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTECOMMUNICATIONHISTORY_H