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