| // 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 "base/base_export.h" |
| #include "base/trace_event/trace_event.h" |
| #include "base/trace_event/trace_event_impl.h" |
| #include "starboard/types.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]; |
| } |
| |
| #if !defined(STARBOARD) |
| void EstimateTraceMemoryOverhead(TraceEventMemoryOverhead* overhead); |
| #endif |
| |
| // 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_; |
| #if !defined(STARBOARD) |
| std::unique_ptr<TraceEventMemoryOverhead> cached_overhead_estimate_; |
| #endif |
| 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; |
| |
| |
| #if !defined(STARBOARD) |
| // Computes an estimate of the size of the buffer, including all the retained |
| // objects. |
| virtual void EstimateTraceMemoryOverhead( |
| TraceEventMemoryOverhead* overhead) = 0; |
| #endif |
| |
| 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_ |