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"
2728namespace lldb_private {
2829namespace 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)
3038struct 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-
6769struct 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+
96104protected:
97105 TelemetryManager (std::unique_ptr<llvm::telemetry::Config> config);
98106
@@ -110,9 +118,9 @@ class TelemetryManager : public llvm::telemetry::Manager {
110118template <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
141150private:
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
0 commit comments