|  | // Copyright 2015 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef BASE_TRACE_EVENT_TRACE_BUFFER_H_ | 
|  | #define BASE_TRACE_EVENT_TRACE_BUFFER_H_ | 
|  |  | 
|  | #include <stddef.h> | 
|  | #include <stdint.h> | 
|  |  | 
|  | #include "base/base_export.h" | 
|  | #include "base/trace_event/trace_event.h" | 
|  | #include "base/trace_event/trace_event_impl.h" | 
|  |  | 
|  | namespace base { | 
|  |  | 
|  | namespace trace_event { | 
|  |  | 
|  | // TraceBufferChunk is the basic unit of TraceBuffer. | 
|  | class BASE_EXPORT TraceBufferChunk { | 
|  | public: | 
|  | explicit TraceBufferChunk(uint32_t seq); | 
|  | ~TraceBufferChunk(); | 
|  |  | 
|  | void Reset(uint32_t new_seq); | 
|  | TraceEvent* AddTraceEvent(size_t* event_index); | 
|  | bool IsFull() const { return next_free_ == kTraceBufferChunkSize; } | 
|  |  | 
|  | uint32_t seq() const { return seq_; } | 
|  | size_t capacity() const { return kTraceBufferChunkSize; } | 
|  | size_t size() const { return next_free_; } | 
|  |  | 
|  | TraceEvent* GetEventAt(size_t index) { | 
|  | DCHECK(index < size()); | 
|  | return &chunk_[index]; | 
|  | } | 
|  | const TraceEvent* GetEventAt(size_t index) const { | 
|  | DCHECK(index < size()); | 
|  | return &chunk_[index]; | 
|  | } | 
|  |  | 
|  | void EstimateTraceMemoryOverhead(TraceEventMemoryOverhead* overhead); | 
|  |  | 
|  | // These values must be kept consistent with the numbers of bits of | 
|  | // chunk_index and event_index fields in TraceEventHandle | 
|  | // (in trace_event_impl.h). | 
|  | static const size_t kMaxChunkIndex = (1u << 26) - 1; | 
|  | static const size_t kTraceBufferChunkSize = 64; | 
|  |  | 
|  | private: | 
|  | size_t next_free_; | 
|  | std::unique_ptr<TraceEventMemoryOverhead> cached_overhead_estimate_; | 
|  | TraceEvent chunk_[kTraceBufferChunkSize]; | 
|  | uint32_t seq_; | 
|  | }; | 
|  |  | 
|  | // TraceBuffer holds the events as they are collected. | 
|  | class BASE_EXPORT TraceBuffer { | 
|  | public: | 
|  | virtual ~TraceBuffer() = default; | 
|  |  | 
|  | virtual std::unique_ptr<TraceBufferChunk> GetChunk(size_t* index) = 0; | 
|  | virtual void ReturnChunk(size_t index, | 
|  | std::unique_ptr<TraceBufferChunk> chunk) = 0; | 
|  |  | 
|  | virtual bool IsFull() const = 0; | 
|  | virtual size_t Size() const = 0; | 
|  | virtual size_t Capacity() const = 0; | 
|  | virtual TraceEvent* GetEventByHandle(TraceEventHandle handle) = 0; | 
|  |  | 
|  | // For iteration. Each TraceBuffer can only be iterated once. | 
|  | virtual const TraceBufferChunk* NextChunk() = 0; | 
|  |  | 
|  |  | 
|  | // Computes an estimate of the size of the buffer, including all the retained | 
|  | // objects. | 
|  | virtual void EstimateTraceMemoryOverhead( | 
|  | TraceEventMemoryOverhead* overhead) = 0; | 
|  |  | 
|  | static TraceBuffer* CreateTraceBufferRingBuffer(size_t max_chunks); | 
|  | static TraceBuffer* CreateTraceBufferVectorOfSize(size_t max_chunks); | 
|  | }; | 
|  |  | 
|  | // TraceResultBuffer collects and converts trace fragments returned by TraceLog | 
|  | // to JSON output. | 
|  | class BASE_EXPORT TraceResultBuffer { | 
|  | public: | 
|  | typedef base::Callback<void(const std::string&)> OutputCallback; | 
|  |  | 
|  | // If you don't need to stream JSON chunks out efficiently, and just want to | 
|  | // get a complete JSON string after calling Finish, use this struct to collect | 
|  | // JSON trace output. | 
|  | struct BASE_EXPORT SimpleOutput { | 
|  | OutputCallback GetCallback(); | 
|  | void Append(const std::string& json_string); | 
|  |  | 
|  | // Do what you want with the json_output_ string after calling | 
|  | // TraceResultBuffer::Finish. | 
|  | std::string json_output; | 
|  | }; | 
|  |  | 
|  | TraceResultBuffer(); | 
|  | ~TraceResultBuffer(); | 
|  |  | 
|  | // Set callback. The callback will be called during Start with the initial | 
|  | // JSON output and during AddFragment and Finish with following JSON output | 
|  | // chunks. The callback target must live past the last calls to | 
|  | // TraceResultBuffer::Start/AddFragment/Finish. | 
|  | void SetOutputCallback(const OutputCallback& json_chunk_callback); | 
|  |  | 
|  | // Start JSON output. This resets all internal state, so you can reuse | 
|  | // the TraceResultBuffer by calling Start. | 
|  | void Start(); | 
|  |  | 
|  | // Call AddFragment 0 or more times to add trace fragments from TraceLog. | 
|  | void AddFragment(const std::string& trace_fragment); | 
|  |  | 
|  | // When all fragments have been added, call Finish to complete the JSON | 
|  | // formatted output. | 
|  | void Finish(); | 
|  |  | 
|  | private: | 
|  | OutputCallback output_callback_; | 
|  | bool append_comma_; | 
|  | }; | 
|  |  | 
|  | }  // namespace trace_event | 
|  | }  // namespace base | 
|  |  | 
|  | #endif  // BASE_TRACE_EVENT_TRACE_BUFFER_H_ |