@@ -27,21 +27,24 @@ namespace {
27
27
// Perhaps we should replace this by something that disturbs performance less.
28
28
class JSONTracer : public EventTracer {
29
29
public:
30
- JSONTracer (llvm::raw_ostream &Out, bool Pretty)
31
- : Out(Out), Sep(" " ), Start(std::chrono::system_clock::now()),
32
- JSONFormat (Pretty ? " {0:2}" : " {0}" ) {
30
+ JSONTracer (llvm::raw_ostream &OS, bool Pretty)
31
+ : Out(OS, Pretty ? 2 : 0 ), Start(std::chrono::system_clock::now()) {
33
32
// The displayTimeUnit must be ns to avoid low-precision overlap
34
33
// calculations!
35
- Out << R"( {"displayTimeUnit":"ns","traceEvents":[)"
36
- << " \n " ;
34
+ Out.objectBegin ();
35
+ Out.attribute (" displayTimeUnit" , " ns" );
36
+ Out.attributeBegin (" traceEvents" );
37
+ Out.arrayBegin ();
37
38
rawEvent (" M" , llvm::json::Object{
38
39
{" name" , " process_name" },
39
40
{" args" , llvm::json::Object{{" name" , " clangd" }}},
40
41
});
41
42
}
42
43
43
44
~JSONTracer () {
44
- Out << " \n ]}" ;
45
+ Out.arrayEnd ();
46
+ Out.attributeEnd ();
47
+ Out.objectEnd ();
45
48
Out.flush ();
46
49
}
47
50
@@ -73,7 +76,7 @@ class JSONTracer : public EventTracer {
73
76
Contents[" ts" ] = Timestamp ? Timestamp : timestamp ();
74
77
Contents[" tid" ] = int64_t (TID);
75
78
std::lock_guard<std::mutex> Lock (Mu);
76
- rawEvent (Phase, std::move ( Contents) );
79
+ rawEvent (Phase, Contents);
77
80
}
78
81
79
82
private:
@@ -145,13 +148,14 @@ class JSONTracer : public EventTracer {
145
148
// Record an event. ph and pid are set.
146
149
// Contents must be a list of the other JSON key/values.
147
150
void rawEvent (llvm::StringRef Phase,
148
- llvm::json::Object & &Event) /* REQUIRES(Mu)*/ {
151
+ const llvm::json::Object &Event) /* REQUIRES(Mu)*/ {
149
152
// PID 0 represents the clangd process.
150
- Event[" pid" ] = 0 ;
151
- Event[" ph" ] = Phase;
152
- Out << Sep
153
- << llvm::formatv (JSONFormat, llvm::json::Value (std::move (Event)));
154
- Sep = " ,\n " ;
153
+ Out.object ([&]{
154
+ Out.attribute (" pid" , 0 );
155
+ Out.attribute (" ph" , Phase);
156
+ for (const auto & KV : Event)
157
+ Out.attribute (KV.first , KV.second );
158
+ });
155
159
}
156
160
157
161
// If we haven't already, emit metadata describing this thread.
@@ -177,11 +181,9 @@ class JSONTracer : public EventTracer {
177
181
}
178
182
179
183
std::mutex Mu;
180
- llvm::raw_ostream &Out /* GUARDED_BY(Mu)*/ ;
181
- const char *Sep /* GUARDED_BY(Mu)*/ ;
184
+ llvm::json::OStream Out /* GUARDED_BY(Mu)*/ ;
182
185
llvm::DenseSet<uint64_t > ThreadsWithMD /* GUARDED_BY(Mu)*/ ;
183
186
const llvm::sys::TimePoint<> Start;
184
- const char *JSONFormat;
185
187
};
186
188
187
189
Key<std::unique_ptr<JSONTracer::JSONSpan>> JSONTracer::SpanKey;
0 commit comments