xref: /aosp_15_r20/external/cronet/base/trace_event/trace_buffer.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2015 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_TRACE_EVENT_TRACE_BUFFER_H_
6*6777b538SAndroid Build Coastguard Worker #define BASE_TRACE_EVENT_TRACE_BUFFER_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
9*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
10*6777b538SAndroid Build Coastguard Worker 
11*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/check.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/trace_event/trace_event.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/trace_event/trace_event_impl.h"
15*6777b538SAndroid Build Coastguard Worker 
16*6777b538SAndroid Build Coastguard Worker namespace base {
17*6777b538SAndroid Build Coastguard Worker 
18*6777b538SAndroid Build Coastguard Worker namespace trace_event {
19*6777b538SAndroid Build Coastguard Worker 
20*6777b538SAndroid Build Coastguard Worker // TraceBufferChunk is the basic unit of TraceBuffer.
21*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT TraceBufferChunk {
22*6777b538SAndroid Build Coastguard Worker  public:
23*6777b538SAndroid Build Coastguard Worker   explicit TraceBufferChunk(uint32_t seq);
24*6777b538SAndroid Build Coastguard Worker   ~TraceBufferChunk();
25*6777b538SAndroid Build Coastguard Worker 
26*6777b538SAndroid Build Coastguard Worker   void Reset(uint32_t new_seq);
27*6777b538SAndroid Build Coastguard Worker   TraceEvent* AddTraceEvent(size_t* event_index);
IsFull()28*6777b538SAndroid Build Coastguard Worker   bool IsFull() const { return next_free_ == kTraceBufferChunkSize; }
29*6777b538SAndroid Build Coastguard Worker 
seq()30*6777b538SAndroid Build Coastguard Worker   uint32_t seq() const { return seq_; }
capacity()31*6777b538SAndroid Build Coastguard Worker   size_t capacity() const { return kTraceBufferChunkSize; }
size()32*6777b538SAndroid Build Coastguard Worker   size_t size() const { return next_free_; }
33*6777b538SAndroid Build Coastguard Worker 
GetEventAt(size_t index)34*6777b538SAndroid Build Coastguard Worker   TraceEvent* GetEventAt(size_t index) {
35*6777b538SAndroid Build Coastguard Worker     DCHECK(index < size());
36*6777b538SAndroid Build Coastguard Worker     return &chunk_[index];
37*6777b538SAndroid Build Coastguard Worker   }
GetEventAt(size_t index)38*6777b538SAndroid Build Coastguard Worker   const TraceEvent* GetEventAt(size_t index) const {
39*6777b538SAndroid Build Coastguard Worker     DCHECK(index < size());
40*6777b538SAndroid Build Coastguard Worker     return &chunk_[index];
41*6777b538SAndroid Build Coastguard Worker   }
42*6777b538SAndroid Build Coastguard Worker 
43*6777b538SAndroid Build Coastguard Worker   void EstimateTraceMemoryOverhead(TraceEventMemoryOverhead* overhead);
44*6777b538SAndroid Build Coastguard Worker 
45*6777b538SAndroid Build Coastguard Worker   // These values must be kept consistent with the numbers of bits of
46*6777b538SAndroid Build Coastguard Worker   // chunk_index and event_index fields in TraceEventHandle
47*6777b538SAndroid Build Coastguard Worker   // (in trace_event_impl.h).
48*6777b538SAndroid Build Coastguard Worker   static const size_t kMaxChunkIndex = (1u << 26) - 1;
49*6777b538SAndroid Build Coastguard Worker   static const size_t kTraceBufferChunkSize = 64;
50*6777b538SAndroid Build Coastguard Worker 
51*6777b538SAndroid Build Coastguard Worker  private:
52*6777b538SAndroid Build Coastguard Worker   size_t next_free_;
53*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<TraceEventMemoryOverhead> cached_overhead_estimate_;
54*6777b538SAndroid Build Coastguard Worker   TraceEvent chunk_[kTraceBufferChunkSize];
55*6777b538SAndroid Build Coastguard Worker   uint32_t seq_;
56*6777b538SAndroid Build Coastguard Worker };
57*6777b538SAndroid Build Coastguard Worker 
58*6777b538SAndroid Build Coastguard Worker // TraceBuffer holds the events as they are collected.
59*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT TraceBuffer {
60*6777b538SAndroid Build Coastguard Worker  public:
61*6777b538SAndroid Build Coastguard Worker   virtual ~TraceBuffer() = default;
62*6777b538SAndroid Build Coastguard Worker 
63*6777b538SAndroid Build Coastguard Worker   virtual std::unique_ptr<TraceBufferChunk> GetChunk(size_t* index) = 0;
64*6777b538SAndroid Build Coastguard Worker   virtual void ReturnChunk(size_t index,
65*6777b538SAndroid Build Coastguard Worker                            std::unique_ptr<TraceBufferChunk> chunk) = 0;
66*6777b538SAndroid Build Coastguard Worker 
67*6777b538SAndroid Build Coastguard Worker   virtual bool IsFull() const = 0;
68*6777b538SAndroid Build Coastguard Worker   virtual size_t Size() const = 0;
69*6777b538SAndroid Build Coastguard Worker   virtual size_t Capacity() const = 0;
70*6777b538SAndroid Build Coastguard Worker   virtual TraceEvent* GetEventByHandle(TraceEventHandle handle) = 0;
71*6777b538SAndroid Build Coastguard Worker 
72*6777b538SAndroid Build Coastguard Worker   // For iteration. Each TraceBuffer can only be iterated once.
73*6777b538SAndroid Build Coastguard Worker   virtual const TraceBufferChunk* NextChunk() = 0;
74*6777b538SAndroid Build Coastguard Worker 
75*6777b538SAndroid Build Coastguard Worker 
76*6777b538SAndroid Build Coastguard Worker   // Computes an estimate of the size of the buffer, including all the retained
77*6777b538SAndroid Build Coastguard Worker   // objects.
78*6777b538SAndroid Build Coastguard Worker   virtual void EstimateTraceMemoryOverhead(
79*6777b538SAndroid Build Coastguard Worker       TraceEventMemoryOverhead* overhead) = 0;
80*6777b538SAndroid Build Coastguard Worker 
81*6777b538SAndroid Build Coastguard Worker   static TraceBuffer* CreateTraceBufferRingBuffer(size_t max_chunks);
82*6777b538SAndroid Build Coastguard Worker   static TraceBuffer* CreateTraceBufferVectorOfSize(size_t max_chunks);
83*6777b538SAndroid Build Coastguard Worker };
84*6777b538SAndroid Build Coastguard Worker 
85*6777b538SAndroid Build Coastguard Worker // TraceResultBuffer collects and converts trace fragments returned by TraceLog
86*6777b538SAndroid Build Coastguard Worker // to JSON output.
87*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT TraceResultBuffer {
88*6777b538SAndroid Build Coastguard Worker  public:
89*6777b538SAndroid Build Coastguard Worker   using OutputCallback = base::RepeatingCallback<void(const std::string&)>;
90*6777b538SAndroid Build Coastguard Worker 
91*6777b538SAndroid Build Coastguard Worker   // If you don't need to stream JSON chunks out efficiently, and just want to
92*6777b538SAndroid Build Coastguard Worker   // get a complete JSON string after calling Finish, use this struct to collect
93*6777b538SAndroid Build Coastguard Worker   // JSON trace output.
94*6777b538SAndroid Build Coastguard Worker   struct BASE_EXPORT SimpleOutput {
95*6777b538SAndroid Build Coastguard Worker     OutputCallback GetCallback();
96*6777b538SAndroid Build Coastguard Worker     void Append(const std::string& json_string);
97*6777b538SAndroid Build Coastguard Worker 
98*6777b538SAndroid Build Coastguard Worker     // Do what you want with the json_output_ string after calling
99*6777b538SAndroid Build Coastguard Worker     // TraceResultBuffer::Finish.
100*6777b538SAndroid Build Coastguard Worker     std::string json_output;
101*6777b538SAndroid Build Coastguard Worker   };
102*6777b538SAndroid Build Coastguard Worker 
103*6777b538SAndroid Build Coastguard Worker   TraceResultBuffer();
104*6777b538SAndroid Build Coastguard Worker   ~TraceResultBuffer();
105*6777b538SAndroid Build Coastguard Worker 
106*6777b538SAndroid Build Coastguard Worker   // Set callback. The callback will be called during Start with the initial
107*6777b538SAndroid Build Coastguard Worker   // JSON output and during AddFragment and Finish with following JSON output
108*6777b538SAndroid Build Coastguard Worker   // chunks. The callback target must live past the last calls to
109*6777b538SAndroid Build Coastguard Worker   // TraceResultBuffer::Start/AddFragment/Finish.
110*6777b538SAndroid Build Coastguard Worker   void SetOutputCallback(OutputCallback json_chunk_callback);
111*6777b538SAndroid Build Coastguard Worker 
112*6777b538SAndroid Build Coastguard Worker   // Start JSON output. This resets all internal state, so you can reuse
113*6777b538SAndroid Build Coastguard Worker   // the TraceResultBuffer by calling Start.
114*6777b538SAndroid Build Coastguard Worker   void Start();
115*6777b538SAndroid Build Coastguard Worker 
116*6777b538SAndroid Build Coastguard Worker   // Call AddFragment 0 or more times to add trace fragments from TraceLog.
117*6777b538SAndroid Build Coastguard Worker   void AddFragment(const std::string& trace_fragment);
118*6777b538SAndroid Build Coastguard Worker 
119*6777b538SAndroid Build Coastguard Worker   // When all fragments have been added, call Finish to complete the JSON
120*6777b538SAndroid Build Coastguard Worker   // formatted output.
121*6777b538SAndroid Build Coastguard Worker   void Finish();
122*6777b538SAndroid Build Coastguard Worker 
123*6777b538SAndroid Build Coastguard Worker  private:
124*6777b538SAndroid Build Coastguard Worker   OutputCallback output_callback_;
125*6777b538SAndroid Build Coastguard Worker   bool append_comma_;
126*6777b538SAndroid Build Coastguard Worker };
127*6777b538SAndroid Build Coastguard Worker 
128*6777b538SAndroid Build Coastguard Worker }  // namespace trace_event
129*6777b538SAndroid Build Coastguard Worker }  // namespace base
130*6777b538SAndroid Build Coastguard Worker 
131*6777b538SAndroid Build Coastguard Worker #endif  // BASE_TRACE_EVENT_TRACE_BUFFER_H_
132