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