Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationHistory.h
39644 views
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;
39
bool DidDumpToLog() const { return m_dumped_to_log; }
40
41
private:
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
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
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
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
78