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