Skip to content

Commit c011531

Browse files
committed
address review comments
1 parent bcd793e commit c011531

File tree

4 files changed

+54
-39
lines changed

4 files changed

+54
-39
lines changed

lldb/include/lldb/Core/Telemetry.h

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "lldb/Utility/LLDBLog.h"
1515
#include "lldb/Utility/StructuredData.h"
1616
#include "lldb/lldb-forward.h"
17+
#include "llvm/ADT/FunctionExtras.h"
1718
#include "llvm/ADT/StringExtras.h"
1819
#include "llvm/ADT/StringRef.h"
1920
#include "llvm/Support/JSON.h"
@@ -27,9 +28,16 @@
2728
namespace lldb_private {
2829
namespace telemetry {
2930

31+
// We expect each (direct) subclass of LLDBTelemetryInfo to
32+
// have an LLDBEntryKind in the form 0b11xxxxxxxx
33+
// Specifically:
34+
// - Length: 8 bits
35+
// - First two bits (MSB) must be 11 - the common prefix
36+
// If any of the subclass has descendents, those descendents
37+
// must have their LLDBEntryKind in the similar form (ie., share common prefix)
3038
struct LLDBEntryKind : public ::llvm::telemetry::EntryKind {
31-
static const llvm::telemetry::KindType BaseInfo = 0b11000;
32-
static const llvm::telemetry::KindType DebuggerInfo = 0b11001;
39+
static const llvm::telemetry::KindType BaseInfo = 0b11000000;
40+
static const llvm::telemetry::KindType DebuggerInfo = 0b11000100;
3341
};
3442

3543
/// Defines a convenient type for timestamp of various events.
@@ -58,15 +66,10 @@ struct LLDBBaseTelemetryInfo : public llvm::telemetry::TelemetryInfo {
5866
void serialize(llvm::telemetry::Serializer &serializer) const override;
5967
};
6068

61-
/// Describes the exit status of a debugger.
62-
struct ExitDescription {
63-
int exit_code;
64-
std::string description;
65-
};
66-
6769
struct DebuggerInfo : public LLDBBaseTelemetryInfo {
6870
std::string lldb_version;
69-
std::optional<ExitDescription> exit_desc;
71+
72+
bool is_exit_entry = false;
7073

7174
DebuggerInfo() = default;
7275

@@ -75,7 +78,9 @@ struct DebuggerInfo : public LLDBBaseTelemetryInfo {
7578
}
7679

7780
static bool classof(const llvm::telemetry::TelemetryInfo *T) {
78-
return T->getKind() == LLDBEntryKind::DebuggerInfo;
81+
// Subclasses of this is also acceptable
82+
return (T->getKind() & LLDBEntryKind::DebuggerInfo) ==
83+
LLDBEntryKind::DebuggerInfo;
7984
}
8085

8186
void serialize(llvm::telemetry::Serializer &serializer) const override;
@@ -91,8 +96,11 @@ class TelemetryManager : public llvm::telemetry::Manager {
9196
const llvm::telemetry::Config *GetConfig();
9297

9398
virtual llvm::StringRef GetInstanceName() const = 0;
99+
94100
static TelemetryManager *GetInstance();
95101

102+
static TelemetryManager *GetInstanceIfEnabled();
103+
96104
protected:
97105
TelemetryManager(std::unique_ptr<llvm::telemetry::Config> config);
98106

@@ -110,9 +118,9 @@ class TelemetryManager : public llvm::telemetry::Manager {
110118
template <typename Info> struct ScopedDispatcher {
111119
// The debugger pointer is optional because we may not have a debugger yet.
112120
// In that case, caller must set the debugger later.
113-
ScopedDispatcher(std::function<void(Info *info)> callback,
121+
ScopedDispatcher(llvm::unique_function<void(Info *info)> callback,
114122
Debugger *debugger = nullptr)
115-
: m_callback(callback) {
123+
: m_callback(std::move(callback)) {
116124
// Start the timer.
117125
m_start_time = std::chrono::steady_clock::now();
118126
m_info.debugger = debugger;
@@ -121,11 +129,12 @@ template <typename Info> struct ScopedDispatcher {
121129
void SetDebugger(Debugger *debugger) { m_info.debugger = debugger; }
122130

123131
~ScopedDispatcher() {
124-
TelemetryManager *manager = TelemetryManager::GetInstance();
125132
// If Telemetry is disabled (either at buildtime or runtime),
126133
// then don't do anything.
127-
if (!manager || !manager->GetConfig()->EnableTelemetry)
134+
TelemetryManager *manager = TelemetryManager::GetInstanceIfEnabled();
135+
if (!manager)
128136
return;
137+
129138
m_info.start_time = m_start_time;
130139
// Populate common fields that we can only set now.
131140
m_info.end_time = std::chrono::steady_clock::now();
@@ -140,7 +149,7 @@ template <typename Info> struct ScopedDispatcher {
140149

141150
private:
142151
SteadyTimePoint m_start_time;
143-
std::function<void(Info *info)> m_callback;
152+
llvm::unique_function<void(Info *info)> m_callback;
144153
Info m_info;
145154
};
146155

lldb/source/Core/Debugger.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1003,9 +1003,7 @@ void Debugger::Clear() {
10031003
helper(
10041004
[this](lldb_private::telemetry::DebuggerInfo *info) {
10051005
assert(this == info->debugger);
1006-
// If we are here, then there was no error.
1007-
// Any abnormal exit will be reported by the crash-handler.
1008-
info->exit_desc = {0, ""};
1006+
info->is_exit_entry = true;
10091007
},
10101008
this);
10111009
ClearIOHandlers();

lldb/source/Core/Telemetry.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,7 @@ void DebuggerInfo::serialize(Serializer &serializer) const {
6464
LLDBBaseTelemetryInfo::serialize(serializer);
6565

6666
serializer.write("lldb_version", lldb_version);
67-
if (exit_desc.has_value()) {
68-
serializer.write("exit_code", exit_desc->exit_code);
69-
serializer.write("exit_desc", exit_desc->description);
70-
}
67+
serializer.write("is_exit_entry", is_exit_entry);
7168
}
7269

7370
TelemetryManager::TelemetryManager(std::unique_ptr<Config> config)
@@ -93,6 +90,16 @@ TelemetryManager *TelemetryManager::GetInstance() {
9390
return g_instance.get();
9491
}
9592

93+
TelemetryManager *TelemetryManager::GetInstanceIfEnabled() {
94+
// Telemetry may be enabled at build time but disabled at runtime.
95+
if (TelemetryManager *ins = TelemetryManager::GetInstance()) {
96+
if (ins->GetConfig()->EnableTelemetry)
97+
return ins;
98+
}
99+
100+
return nullptr;
101+
}
102+
96103
void TelemetryManager::SetInstance(std::unique_ptr<TelemetryManager> manager) {
97104
if (Config::BuildTimeEnableTelemetry)
98105
g_instance = std::move(manager);

lldb/unittests/Core/TelemetryTest.cpp

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -22,31 +22,30 @@ struct FakeTelemetryInfo : public telemetry::LLDBBaseTelemetryInfo {
2222
std::string msg;
2323
int num;
2424

25-
::llvm::telemetry::KindType getKind() const override { return 0b11111; }
25+
::llvm::telemetry::KindType getKind() const override { return 0b11111111; }
2626
};
2727

2828
class TestDestination : public llvm::telemetry::Destination {
2929
public:
30-
TestDestination(std::vector<llvm::telemetry::TelemetryInfo *> *entries)
30+
TestDestination(
31+
std::vector<std::unique_ptr<llvm::telemetry::TelemetryInfo>> *entries)
3132
: received_entries(entries) {}
3233

3334
llvm::Error
3435
receiveEntry(const llvm::telemetry::TelemetryInfo *entry) override {
3536
// Save a copy of the entry for later verification (because the original
3637
// entry might have gone out of scope by the time verification is done.
37-
if (auto *fake_entry = llvm::dyn_cast<FakeTelemetryInfo>(entry)) {
38-
FakeTelemetryInfo *copied = new FakeTelemetryInfo();
39-
copied->msg = fake_entry->msg;
40-
copied->num = fake_entry->num;
41-
received_entries->push_back(copied);
42-
}
38+
if (auto *fake_entry = llvm::dyn_cast<FakeTelemetryInfo>(entry))
39+
received_entries->push_back(
40+
std::make_unique<FakeTelemetryInfo>(*fake_entry));
4341
return llvm::Error::success();
4442
}
4543

4644
llvm::StringLiteral name() const override { return "TestDestination"; }
4745

4846
private:
49-
std::vector<llvm::telemetry::TelemetryInfo *> *received_entries;
47+
std::vector<std::unique_ptr<llvm::telemetry::TelemetryInfo>>
48+
*received_entries;
5049
};
5150

5251
class FakePlugin : public telemetry::TelemetryManager {
@@ -92,17 +91,18 @@ TELEMETRY_TEST(TelemetryTest, PluginTest) {
9291
auto *ins = lldb_private::telemetry::TelemetryManager::GetInstance();
9392
ASSERT_NE(ins, nullptr);
9493

95-
std::vector<::llvm::telemetry::TelemetryInfo *> expected_entries;
94+
std::vector<std::unique_ptr<::llvm::telemetry::TelemetryInfo>>
95+
received_entries;
9696
ins->addDestination(
97-
std::make_unique<lldb_private::TestDestination>(&expected_entries));
97+
std::make_unique<lldb_private::TestDestination>(&received_entries));
9898

9999
lldb_private::FakeTelemetryInfo entry;
100100
entry.msg = "";
101101

102102
ASSERT_THAT_ERROR(ins->dispatch(&entry), ::llvm::Succeeded());
103-
ASSERT_EQ(1U, expected_entries.size());
103+
ASSERT_EQ(1U, received_entries.size());
104104
EXPECT_EQ("In FakePlugin",
105-
llvm::dyn_cast<lldb_private::FakeTelemetryInfo>(expected_entries[0])
105+
llvm::dyn_cast<lldb_private::FakeTelemetryInfo>(received_entries[0])
106106
->msg);
107107

108108
ASSERT_EQ("FakeTelemetryPlugin", ins->GetInstanceName());
@@ -112,9 +112,10 @@ TELEMETRY_TEST(TelemetryTest, ScopedDispatcherTest) {
112112
lldb_private::FakePlugin::Initialize();
113113
auto *ins = TelemetryManager::GetInstance();
114114
ASSERT_NE(ins, nullptr);
115-
std::vector<::llvm::telemetry::TelemetryInfo *> expected_entries;
115+
std::vector<std::unique_ptr<::llvm::telemetry::TelemetryInfo>>
116+
received_entries;
116117
ins->addDestination(
117-
std::make_unique<lldb_private::TestDestination>(&expected_entries));
118+
std::make_unique<lldb_private::TestDestination>(&received_entries));
118119

119120
{
120121
ScopedDispatcher<lldb_private::FakeTelemetryInfo> helper(
@@ -131,10 +132,10 @@ TELEMETRY_TEST(TelemetryTest, ScopedDispatcherTest) {
131132
[](lldb_private::FakeTelemetryInfo *info) { info->num = 2; });
132133
}
133134

134-
EXPECT_EQ(3U, expected_entries.size());
135+
EXPECT_EQ(3U, received_entries.size());
135136
for (int i = 0; i < 3; ++i) {
136137
EXPECT_EQ(
137-
i, llvm::dyn_cast<lldb_private::FakeTelemetryInfo>(expected_entries[i])
138+
i, llvm::dyn_cast<lldb_private::FakeTelemetryInfo>(received_entries[i])
138139
->num);
139140
}
140141
}

0 commit comments

Comments
 (0)