| Index: base/debug/trace_event_impl.h
|
| diff --git a/base/debug/trace_event_impl.h b/base/debug/trace_event_impl.h
|
| index 1b1fce34cc209b452da54cad9b68f10696f4b79e..a619d2903546c529f399abc920e3985696d6a8d9 100644
|
| --- a/base/debug/trace_event_impl.h
|
| +++ b/base/debug/trace_event_impl.h
|
| @@ -1,813 +1,14 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| +// Copyright 2014 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.
|
|
|
| +// In the process of moving the trace event files. Right now the headers
|
| +// are being forwarded. In next CLs the change will get completed
|
| +// TODO(ssid): https://code.google.com/p/chromium/issues/detail?id=451032
|
|
|
| #ifndef BASE_DEBUG_TRACE_EVENT_IMPL_H_
|
| #define BASE_DEBUG_TRACE_EVENT_IMPL_H_
|
|
|
| -#include <stack>
|
| -#include <string>
|
| -#include <vector>
|
| -
|
| -#include "base/atomicops.h"
|
| -#include "base/base_export.h"
|
| -#include "base/callback.h"
|
| -#include "base/containers/hash_tables.h"
|
| -#include "base/gtest_prod_util.h"
|
| -#include "base/memory/ref_counted_memory.h"
|
| -#include "base/memory/scoped_vector.h"
|
| -#include "base/observer_list.h"
|
| -#include "base/strings/string_util.h"
|
| -#include "base/synchronization/condition_variable.h"
|
| -#include "base/synchronization/lock.h"
|
| -#include "base/threading/thread.h"
|
| -#include "base/threading/thread_local.h"
|
| -
|
| -// Older style trace macros with explicit id and extra data
|
| -// Only these macros result in publishing data to ETW as currently implemented.
|
| -#define TRACE_EVENT_BEGIN_ETW(name, id, extra) \
|
| - base::debug::TraceLog::AddTraceEventEtw( \
|
| - TRACE_EVENT_PHASE_BEGIN, \
|
| - name, reinterpret_cast<const void*>(id), extra)
|
| -
|
| -#define TRACE_EVENT_END_ETW(name, id, extra) \
|
| - base::debug::TraceLog::AddTraceEventEtw( \
|
| - TRACE_EVENT_PHASE_END, \
|
| - name, reinterpret_cast<const void*>(id), extra)
|
| -
|
| -#define TRACE_EVENT_INSTANT_ETW(name, id, extra) \
|
| - base::debug::TraceLog::AddTraceEventEtw( \
|
| - TRACE_EVENT_PHASE_INSTANT, \
|
| - name, reinterpret_cast<const void*>(id), extra)
|
| -
|
| -template <typename Type>
|
| -struct DefaultSingletonTraits;
|
| -
|
| -namespace base {
|
| -
|
| -class WaitableEvent;
|
| -class MessageLoop;
|
| -
|
| -namespace debug {
|
| -
|
| -// For any argument of type TRACE_VALUE_TYPE_CONVERTABLE the provided
|
| -// class must implement this interface.
|
| -class BASE_EXPORT ConvertableToTraceFormat
|
| - : public RefCounted<ConvertableToTraceFormat> {
|
| - public:
|
| - // Append the class info to the provided |out| string. The appended
|
| - // data must be a valid JSON object. Strings must be properly quoted, and
|
| - // escaped. There is no processing applied to the content after it is
|
| - // appended.
|
| - virtual void AppendAsTraceFormat(std::string* out) const = 0;
|
| -
|
| - std::string ToString() const {
|
| - std::string result;
|
| - AppendAsTraceFormat(&result);
|
| - return result;
|
| - }
|
| -
|
| - protected:
|
| - virtual ~ConvertableToTraceFormat() {}
|
| -
|
| - private:
|
| - friend class RefCounted<ConvertableToTraceFormat>;
|
| -};
|
| -
|
| -struct TraceEventHandle {
|
| - uint32 chunk_seq;
|
| - uint16 chunk_index;
|
| - uint16 event_index;
|
| -};
|
| -
|
| -const int kTraceMaxNumArgs = 2;
|
| -
|
| -class BASE_EXPORT TraceEvent {
|
| - public:
|
| - union TraceValue {
|
| - bool as_bool;
|
| - unsigned long long as_uint;
|
| - long long as_int;
|
| - double as_double;
|
| - const void* as_pointer;
|
| - const char* as_string;
|
| - };
|
| -
|
| - TraceEvent();
|
| - ~TraceEvent();
|
| -
|
| - // We don't need to copy TraceEvent except when TraceEventBuffer is cloned.
|
| - // Use explicit copy method to avoid accidentally misuse of copy.
|
| - void CopyFrom(const TraceEvent& other);
|
| -
|
| - void Initialize(
|
| - int thread_id,
|
| - TimeTicks timestamp,
|
| - TimeTicks thread_timestamp,
|
| - char phase,
|
| - const unsigned char* category_group_enabled,
|
| - const char* name,
|
| - unsigned long long id,
|
| - int num_args,
|
| - const char** arg_names,
|
| - const unsigned char* arg_types,
|
| - const unsigned long long* arg_values,
|
| - const scoped_refptr<ConvertableToTraceFormat>* convertable_values,
|
| - unsigned char flags);
|
| -
|
| - void Reset();
|
| -
|
| - void UpdateDuration(const TimeTicks& now, const TimeTicks& thread_now);
|
| -
|
| - // Serialize event data to JSON
|
| - void AppendAsJSON(std::string* out) const;
|
| - void AppendPrettyPrinted(std::ostringstream* out) const;
|
| -
|
| - static void AppendValueAsJSON(unsigned char type,
|
| - TraceValue value,
|
| - std::string* out);
|
| -
|
| - TimeTicks timestamp() const { return timestamp_; }
|
| - TimeTicks thread_timestamp() const { return thread_timestamp_; }
|
| - char phase() const { return phase_; }
|
| - int thread_id() const { return thread_id_; }
|
| - TimeDelta duration() const { return duration_; }
|
| - TimeDelta thread_duration() const { return thread_duration_; }
|
| - unsigned long long id() const { return id_; }
|
| - unsigned char flags() const { return flags_; }
|
| -
|
| - // Exposed for unittesting:
|
| -
|
| - const base::RefCountedString* parameter_copy_storage() const {
|
| - return parameter_copy_storage_.get();
|
| - }
|
| -
|
| - const unsigned char* category_group_enabled() const {
|
| - return category_group_enabled_;
|
| - }
|
| -
|
| - const char* name() const { return name_; }
|
| -
|
| -#if defined(OS_ANDROID)
|
| - void SendToATrace();
|
| -#endif
|
| -
|
| - private:
|
| - // Note: these are ordered by size (largest first) for optimal packing.
|
| - TimeTicks timestamp_;
|
| - TimeTicks thread_timestamp_;
|
| - TimeDelta duration_;
|
| - TimeDelta thread_duration_;
|
| - // id_ can be used to store phase-specific data.
|
| - unsigned long long id_;
|
| - TraceValue arg_values_[kTraceMaxNumArgs];
|
| - const char* arg_names_[kTraceMaxNumArgs];
|
| - scoped_refptr<ConvertableToTraceFormat> convertable_values_[kTraceMaxNumArgs];
|
| - const unsigned char* category_group_enabled_;
|
| - const char* name_;
|
| - scoped_refptr<base::RefCountedString> parameter_copy_storage_;
|
| - int thread_id_;
|
| - char phase_;
|
| - unsigned char flags_;
|
| - unsigned char arg_types_[kTraceMaxNumArgs];
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(TraceEvent);
|
| -};
|
| -
|
| -// TraceBufferChunk is the basic unit of TraceBuffer.
|
| -class BASE_EXPORT TraceBufferChunk {
|
| - public:
|
| - explicit TraceBufferChunk(uint32 seq)
|
| - : next_free_(0),
|
| - seq_(seq) {
|
| - }
|
| -
|
| - void Reset(uint32 new_seq);
|
| - TraceEvent* AddTraceEvent(size_t* event_index);
|
| - bool IsFull() const { return next_free_ == kTraceBufferChunkSize; }
|
| -
|
| - uint32 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];
|
| - }
|
| -
|
| - scoped_ptr<TraceBufferChunk> Clone() const;
|
| -
|
| - static const size_t kTraceBufferChunkSize = 64;
|
| -
|
| - private:
|
| - size_t next_free_;
|
| - TraceEvent chunk_[kTraceBufferChunkSize];
|
| - uint32 seq_;
|
| -};
|
| -
|
| -// TraceBuffer holds the events as they are collected.
|
| -class BASE_EXPORT TraceBuffer {
|
| - public:
|
| - virtual ~TraceBuffer() {}
|
| -
|
| - virtual scoped_ptr<TraceBufferChunk> GetChunk(size_t *index) = 0;
|
| - virtual void ReturnChunk(size_t index,
|
| - scoped_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;
|
| -
|
| - virtual scoped_ptr<TraceBuffer> CloneForIteration() const = 0;
|
| -};
|
| -
|
| -// 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_;
|
| -};
|
| -
|
| -class BASE_EXPORT CategoryFilter {
|
| - public:
|
| - typedef std::vector<std::string> StringList;
|
| -
|
| - // The default category filter, used when none is provided.
|
| - // Allows all categories through, except if they end in the suffix 'Debug' or
|
| - // 'Test'.
|
| - static const char kDefaultCategoryFilterString[];
|
| -
|
| - // |filter_string| is a comma-delimited list of category wildcards.
|
| - // A category can have an optional '-' prefix to make it an excluded category.
|
| - // All the same rules apply above, so for example, having both included and
|
| - // excluded categories in the same list would not be supported.
|
| - //
|
| - // Example: CategoryFilter"test_MyTest*");
|
| - // Example: CategoryFilter("test_MyTest*,test_OtherStuff");
|
| - // Example: CategoryFilter("-excluded_category1,-excluded_category2");
|
| - // Example: CategoryFilter("-*,webkit"); would disable everything but webkit.
|
| - // Example: CategoryFilter("-webkit"); would enable everything but webkit.
|
| - //
|
| - // Category filters can also be used to configure synthetic delays.
|
| - //
|
| - // Example: CategoryFilter("DELAY(gpu.PresentingFrame;16)"); would make swap
|
| - // buffers always take at least 16 ms.
|
| - // Example: CategoryFilter("DELAY(gpu.PresentingFrame;16;oneshot)"); would
|
| - // make swap buffers take at least 16 ms the first time it is
|
| - // called.
|
| - // Example: CategoryFilter("DELAY(gpu.PresentingFrame;16;alternating)");
|
| - // would make swap buffers take at least 16 ms every other time it
|
| - // is called.
|
| - explicit CategoryFilter(const std::string& filter_string);
|
| -
|
| - CategoryFilter();
|
| -
|
| - CategoryFilter(const CategoryFilter& cf);
|
| -
|
| - ~CategoryFilter();
|
| -
|
| - CategoryFilter& operator=(const CategoryFilter& rhs);
|
| -
|
| - // Writes the string representation of the CategoryFilter. This is a comma
|
| - // separated string, similar in nature to the one used to determine
|
| - // enabled/disabled category patterns, except here there is an arbitrary
|
| - // order, included categories go first, then excluded categories. Excluded
|
| - // categories are distinguished from included categories by the prefix '-'.
|
| - std::string ToString() const;
|
| -
|
| - // Returns true if at least one category in the list is enabled by this
|
| - // category filter.
|
| - bool IsCategoryGroupEnabled(const char* category_group) const;
|
| -
|
| - // Return a list of the synthetic delays specified in this category filter.
|
| - const StringList& GetSyntheticDelayValues() const;
|
| -
|
| - // Merges nested_filter with the current CategoryFilter
|
| - void Merge(const CategoryFilter& nested_filter);
|
| -
|
| - // Clears both included/excluded pattern lists. This would be equivalent to
|
| - // creating a CategoryFilter with an empty string, through the constructor.
|
| - // i.e: CategoryFilter().
|
| - //
|
| - // When using an empty filter, all categories are considered included as we
|
| - // are not excluding anything.
|
| - void Clear();
|
| -
|
| - private:
|
| - FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture, CategoryFilter);
|
| -
|
| - // Returns true if category is enable according to this filter.
|
| - bool IsCategoryEnabled(const char* category_name) const;
|
| -
|
| - static bool IsEmptyOrContainsLeadingOrTrailingWhitespace(
|
| - const std::string& str);
|
| -
|
| - void Initialize(const std::string& filter_string);
|
| - void WriteString(const StringList& values,
|
| - std::string* out,
|
| - bool included) const;
|
| - void WriteString(const StringList& delays, std::string* out) const;
|
| - bool HasIncludedPatterns() const;
|
| -
|
| - StringList included_;
|
| - StringList disabled_;
|
| - StringList excluded_;
|
| - StringList delays_;
|
| -};
|
| -
|
| -class TraceSamplingThread;
|
| -
|
| -// Options determines how the trace buffer stores data.
|
| -enum TraceRecordMode {
|
| - // Record until the trace buffer is full.
|
| - RECORD_UNTIL_FULL,
|
| -
|
| - // Record until the user ends the trace. The trace buffer is a fixed size
|
| - // and we use it as a ring buffer during recording.
|
| - RECORD_CONTINUOUSLY,
|
| -
|
| - // Echo to console. Events are discarded.
|
| - ECHO_TO_CONSOLE,
|
| -
|
| - // Record until the trace buffer is full, but with a huge buffer size.
|
| - RECORD_AS_MUCH_AS_POSSIBLE
|
| -};
|
| -
|
| -struct BASE_EXPORT TraceOptions {
|
| - TraceOptions()
|
| - : record_mode(RECORD_UNTIL_FULL),
|
| - enable_sampling(false),
|
| - enable_systrace(false) {}
|
| -
|
| - explicit TraceOptions(TraceRecordMode record_mode)
|
| - : record_mode(record_mode),
|
| - enable_sampling(false),
|
| - enable_systrace(false) {}
|
| -
|
| - // |options_string| is a comma-delimited list of trace options.
|
| - // Possible options are: "record-until-full", "record-continuously",
|
| - // "trace-to-console", "enable-sampling" and "enable-systrace".
|
| - // The first 3 options are trace recoding modes and hence
|
| - // mutually exclusive. If more than one trace recording modes appear in the
|
| - // options_string, the last one takes precedence. If none of the trace
|
| - // recording mode is specified, recording mode is RECORD_UNTIL_FULL.
|
| - //
|
| - // The trace option will first be reset to the default option
|
| - // (record_mode set to RECORD_UNTIL_FULL, enable_sampling and enable_systrace
|
| - // set to false) before options parsed from |options_string| are applied on
|
| - // it.
|
| - // If |options_string| is invalid, the final state of trace_options is
|
| - // undefined.
|
| - //
|
| - // Example: trace_options.SetFromString("record-until-full")
|
| - // Example: trace_options.SetFromString(
|
| - // "record-continuously, enable-sampling")
|
| - // Example: trace_options.SetFromString("record-until-full, trace-to-console")
|
| - // will set ECHO_TO_CONSOLE as the recording mode.
|
| - //
|
| - // Returns true on success.
|
| - bool SetFromString(const std::string& options_string);
|
| -
|
| - std::string ToString() const;
|
| -
|
| - TraceRecordMode record_mode;
|
| - bool enable_sampling;
|
| - bool enable_systrace;
|
| -};
|
| -
|
| -struct BASE_EXPORT TraceLogStatus {
|
| - TraceLogStatus();
|
| - ~TraceLogStatus();
|
| - size_t event_capacity;
|
| - size_t event_count;
|
| -};
|
| -
|
| -class BASE_EXPORT TraceLog {
|
| - public:
|
| - enum Mode {
|
| - DISABLED = 0,
|
| - RECORDING_MODE,
|
| - MONITORING_MODE,
|
| - };
|
| -
|
| - // The pointer returned from GetCategoryGroupEnabledInternal() points to a
|
| - // value with zero or more of the following bits. Used in this class only.
|
| - // The TRACE_EVENT macros should only use the value as a bool.
|
| - // These values must be in sync with macro values in TraceEvent.h in Blink.
|
| - enum CategoryGroupEnabledFlags {
|
| - // Category group enabled for the recording mode.
|
| - ENABLED_FOR_RECORDING = 1 << 0,
|
| - // Category group enabled for the monitoring mode.
|
| - ENABLED_FOR_MONITORING = 1 << 1,
|
| - // Category group enabled by SetEventCallbackEnabled().
|
| - ENABLED_FOR_EVENT_CALLBACK = 1 << 2,
|
| - };
|
| -
|
| - static TraceLog* GetInstance();
|
| -
|
| - // Get set of known category groups. This can change as new code paths are
|
| - // reached. The known category groups are inserted into |category_groups|.
|
| - void GetKnownCategoryGroups(std::vector<std::string>* category_groups);
|
| -
|
| - // Retrieves a copy (for thread-safety) of the current CategoryFilter.
|
| - CategoryFilter GetCurrentCategoryFilter();
|
| -
|
| - // Retrieves a copy (for thread-safety) of the current TraceOptions.
|
| - TraceOptions GetCurrentTraceOptions() const;
|
| -
|
| - // Enables normal tracing (recording trace events in the trace buffer).
|
| - // See CategoryFilter comments for details on how to control what categories
|
| - // will be traced. If tracing has already been enabled, |category_filter| will
|
| - // be merged into the current category filter.
|
| - void SetEnabled(const CategoryFilter& category_filter,
|
| - Mode mode, const TraceOptions& options);
|
| -
|
| - // Disables normal tracing for all categories.
|
| - void SetDisabled();
|
| -
|
| - bool IsEnabled() { return mode_ != DISABLED; }
|
| -
|
| - // The number of times we have begun recording traces. If tracing is off,
|
| - // returns -1. If tracing is on, then it returns the number of times we have
|
| - // recorded a trace. By watching for this number to increment, you can
|
| - // passively discover when a new trace has begun. This is then used to
|
| - // implement the TRACE_EVENT_IS_NEW_TRACE() primitive.
|
| - int GetNumTracesRecorded();
|
| -
|
| -#if defined(OS_ANDROID)
|
| - void StartATrace();
|
| - void StopATrace();
|
| - void AddClockSyncMetadataEvent();
|
| -#endif
|
| -
|
| - // Enabled state listeners give a callback when tracing is enabled or
|
| - // disabled. This can be used to tie into other library's tracing systems
|
| - // on-demand.
|
| - class BASE_EXPORT EnabledStateObserver {
|
| - public:
|
| - // Called just after the tracing system becomes enabled, outside of the
|
| - // |lock_|. TraceLog::IsEnabled() is true at this point.
|
| - virtual void OnTraceLogEnabled() = 0;
|
| -
|
| - // Called just after the tracing system disables, outside of the |lock_|.
|
| - // TraceLog::IsEnabled() is false at this point.
|
| - virtual void OnTraceLogDisabled() = 0;
|
| - };
|
| - void AddEnabledStateObserver(EnabledStateObserver* listener);
|
| - void RemoveEnabledStateObserver(EnabledStateObserver* listener);
|
| - bool HasEnabledStateObserver(EnabledStateObserver* listener) const;
|
| -
|
| - TraceLogStatus GetStatus() const;
|
| - bool BufferIsFull() const;
|
| -
|
| - // Not using base::Callback because of its limited by 7 parameters.
|
| - // Also, using primitive type allows directly passing callback from WebCore.
|
| - // WARNING: It is possible for the previously set callback to be called
|
| - // after a call to SetEventCallbackEnabled() that replaces or a call to
|
| - // SetEventCallbackDisabled() that disables the callback.
|
| - // This callback may be invoked on any thread.
|
| - // For TRACE_EVENT_PHASE_COMPLETE events, the client will still receive pairs
|
| - // of TRACE_EVENT_PHASE_BEGIN and TRACE_EVENT_PHASE_END events to keep the
|
| - // interface simple.
|
| - typedef void (*EventCallback)(TimeTicks timestamp,
|
| - char phase,
|
| - const unsigned char* category_group_enabled,
|
| - const char* name,
|
| - unsigned long long id,
|
| - int num_args,
|
| - const char* const arg_names[],
|
| - const unsigned char arg_types[],
|
| - const unsigned long long arg_values[],
|
| - unsigned char flags);
|
| -
|
| - // Enable tracing for EventCallback.
|
| - void SetEventCallbackEnabled(const CategoryFilter& category_filter,
|
| - EventCallback cb);
|
| - void SetEventCallbackDisabled();
|
| -
|
| - // Flush all collected events to the given output callback. The callback will
|
| - // be called one or more times either synchronously or asynchronously from
|
| - // the current thread with IPC-bite-size chunks. The string format is
|
| - // undefined. Use TraceResultBuffer to convert one or more trace strings to
|
| - // JSON. The callback can be null if the caller doesn't want any data.
|
| - // Due to the implementation of thread-local buffers, flush can't be
|
| - // done when tracing is enabled. If called when tracing is enabled, the
|
| - // callback will be called directly with (empty_string, false) to indicate
|
| - // the end of this unsuccessful flush.
|
| - typedef base::Callback<void(const scoped_refptr<base::RefCountedString>&,
|
| - bool has_more_events)> OutputCallback;
|
| - void Flush(const OutputCallback& cb);
|
| - void FlushButLeaveBufferIntact(const OutputCallback& flush_output_callback);
|
| -
|
| - // Called by TRACE_EVENT* macros, don't call this directly.
|
| - // The name parameter is a category group for example:
|
| - // TRACE_EVENT0("renderer,webkit", "WebViewImpl::HandleInputEvent")
|
| - static const unsigned char* GetCategoryGroupEnabled(const char* name);
|
| - static const char* GetCategoryGroupName(
|
| - const unsigned char* category_group_enabled);
|
| -
|
| - // Called by TRACE_EVENT* macros, don't call this directly.
|
| - // If |copy| is set, |name|, |arg_name1| and |arg_name2| will be deep copied
|
| - // into the event; see "Memory scoping note" and TRACE_EVENT_COPY_XXX above.
|
| - TraceEventHandle AddTraceEvent(
|
| - char phase,
|
| - const unsigned char* category_group_enabled,
|
| - const char* name,
|
| - unsigned long long id,
|
| - int num_args,
|
| - const char** arg_names,
|
| - const unsigned char* arg_types,
|
| - const unsigned long long* arg_values,
|
| - const scoped_refptr<ConvertableToTraceFormat>* convertable_values,
|
| - unsigned char flags);
|
| - TraceEventHandle AddTraceEventWithThreadIdAndTimestamp(
|
| - char phase,
|
| - const unsigned char* category_group_enabled,
|
| - const char* name,
|
| - unsigned long long id,
|
| - int thread_id,
|
| - const TimeTicks& timestamp,
|
| - int num_args,
|
| - const char** arg_names,
|
| - const unsigned char* arg_types,
|
| - const unsigned long long* arg_values,
|
| - const scoped_refptr<ConvertableToTraceFormat>* convertable_values,
|
| - unsigned char flags);
|
| - static void AddTraceEventEtw(char phase,
|
| - const char* category_group,
|
| - const void* id,
|
| - const char* extra);
|
| - static void AddTraceEventEtw(char phase,
|
| - const char* category_group,
|
| - const void* id,
|
| - const std::string& extra);
|
| -
|
| - void UpdateTraceEventDuration(const unsigned char* category_group_enabled,
|
| - const char* name,
|
| - TraceEventHandle handle);
|
| -
|
| - // For every matching event, the callback will be called.
|
| - typedef base::Callback<void()> WatchEventCallback;
|
| - void SetWatchEvent(const std::string& category_name,
|
| - const std::string& event_name,
|
| - const WatchEventCallback& callback);
|
| - // Cancel the watch event. If tracing is enabled, this may race with the
|
| - // watch event notification firing.
|
| - void CancelWatchEvent();
|
| -
|
| - int process_id() const { return process_id_; }
|
| -
|
| - // Exposed for unittesting:
|
| -
|
| - void WaitSamplingEventForTesting();
|
| -
|
| - // Allows deleting our singleton instance.
|
| - static void DeleteForTesting();
|
| -
|
| - // Allow tests to inspect TraceEvents.
|
| - TraceEvent* GetEventByHandle(TraceEventHandle handle);
|
| -
|
| - void SetProcessID(int process_id);
|
| -
|
| - // Process sort indices, if set, override the order of a process will appear
|
| - // relative to other processes in the trace viewer. Processes are sorted first
|
| - // on their sort index, ascending, then by their name, and then tid.
|
| - void SetProcessSortIndex(int sort_index);
|
| -
|
| - // Sets the name of the process.
|
| - void SetProcessName(const std::string& process_name);
|
| -
|
| - // Processes can have labels in addition to their names. Use labels, for
|
| - // instance, to list out the web page titles that a process is handling.
|
| - void UpdateProcessLabel(int label_id, const std::string& current_label);
|
| - void RemoveProcessLabel(int label_id);
|
| -
|
| - // Thread sort indices, if set, override the order of a thread will appear
|
| - // within its process in the trace viewer. Threads are sorted first on their
|
| - // sort index, ascending, then by their name, and then tid.
|
| - void SetThreadSortIndex(PlatformThreadId , int sort_index);
|
| -
|
| - // Allow setting an offset between the current TimeTicks time and the time
|
| - // that should be reported.
|
| - void SetTimeOffset(TimeDelta offset);
|
| -
|
| - size_t GetObserverCountForTest() const;
|
| -
|
| - // Call this method if the current thread may block the message loop to
|
| - // prevent the thread from using the thread-local buffer because the thread
|
| - // may not handle the flush request in time causing lost of unflushed events.
|
| - void SetCurrentThreadBlocksMessageLoop();
|
| -
|
| - private:
|
| - typedef unsigned int InternalTraceOptions;
|
| -
|
| - FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture,
|
| - TraceBufferRingBufferGetReturnChunk);
|
| - FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture,
|
| - TraceBufferRingBufferHalfIteration);
|
| - FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture,
|
| - TraceBufferRingBufferFullIteration);
|
| - FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture,
|
| - TraceBufferVectorReportFull);
|
| - FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture,
|
| - ConvertTraceOptionsToInternalOptions);
|
| - FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture,
|
| - TraceRecordAsMuchAsPossibleMode);
|
| -
|
| - // This allows constructor and destructor to be private and usable only
|
| - // by the Singleton class.
|
| - friend struct DefaultSingletonTraits<TraceLog>;
|
| -
|
| - // Enable/disable each category group based on the current mode_,
|
| - // category_filter_, event_callback_ and event_callback_category_filter_.
|
| - // Enable the category group in the enabled mode if category_filter_ matches
|
| - // the category group, or event_callback_ is not null and
|
| - // event_callback_category_filter_ matches the category group.
|
| - void UpdateCategoryGroupEnabledFlags();
|
| - void UpdateCategoryGroupEnabledFlag(size_t category_index);
|
| -
|
| - // Configure synthetic delays based on the values set in the current
|
| - // category filter.
|
| - void UpdateSyntheticDelaysFromCategoryFilter();
|
| -
|
| - InternalTraceOptions GetInternalOptionsFromTraceOptions(
|
| - const TraceOptions& options);
|
| -
|
| - class ThreadLocalEventBuffer;
|
| - class OptionalAutoLock;
|
| -
|
| - TraceLog();
|
| - ~TraceLog();
|
| - const unsigned char* GetCategoryGroupEnabledInternal(const char* name);
|
| - void AddMetadataEventsWhileLocked();
|
| -
|
| - InternalTraceOptions trace_options() const {
|
| - return static_cast<InternalTraceOptions>(
|
| - subtle::NoBarrier_Load(&trace_options_));
|
| - }
|
| -
|
| - TraceBuffer* trace_buffer() const { return logged_events_.get(); }
|
| - TraceBuffer* CreateTraceBuffer();
|
| - TraceBuffer* CreateTraceBufferVectorOfSize(size_t max_chunks);
|
| -
|
| - std::string EventToConsoleMessage(unsigned char phase,
|
| - const TimeTicks& timestamp,
|
| - TraceEvent* trace_event);
|
| -
|
| - TraceEvent* AddEventToThreadSharedChunkWhileLocked(TraceEventHandle* handle,
|
| - bool check_buffer_is_full);
|
| - void CheckIfBufferIsFullWhileLocked();
|
| - void SetDisabledWhileLocked();
|
| -
|
| - TraceEvent* GetEventByHandleInternal(TraceEventHandle handle,
|
| - OptionalAutoLock* lock);
|
| -
|
| - // |generation| is used in the following callbacks to check if the callback
|
| - // is called for the flush of the current |logged_events_|.
|
| - void FlushCurrentThread(int generation);
|
| - void ConvertTraceEventsToTraceFormat(scoped_ptr<TraceBuffer> logged_events,
|
| - const TraceLog::OutputCallback& flush_output_callback);
|
| - void FinishFlush(int generation);
|
| - void OnFlushTimeout(int generation);
|
| -
|
| - int generation() const {
|
| - return static_cast<int>(subtle::NoBarrier_Load(&generation_));
|
| - }
|
| - bool CheckGeneration(int generation) const {
|
| - return generation == this->generation();
|
| - }
|
| - void UseNextTraceBuffer();
|
| -
|
| - TimeTicks OffsetNow() const {
|
| - return OffsetTimestamp(TimeTicks::NowFromSystemTraceTime());
|
| - }
|
| - TimeTicks OffsetTimestamp(const TimeTicks& timestamp) const {
|
| - return timestamp - time_offset_;
|
| - }
|
| -
|
| - // Internal representation of trace options since we store the currently used
|
| - // trace option as an AtomicWord.
|
| - static const InternalTraceOptions kInternalNone;
|
| - static const InternalTraceOptions kInternalRecordUntilFull;
|
| - static const InternalTraceOptions kInternalRecordContinuously;
|
| - static const InternalTraceOptions kInternalEchoToConsole;
|
| - static const InternalTraceOptions kInternalEnableSampling;
|
| - static const InternalTraceOptions kInternalRecordAsMuchAsPossible;
|
| -
|
| - // This lock protects TraceLog member accesses (except for members protected
|
| - // by thread_info_lock_) from arbitrary threads.
|
| - mutable Lock lock_;
|
| - // This lock protects accesses to thread_names_, thread_event_start_times_
|
| - // and thread_colors_.
|
| - Lock thread_info_lock_;
|
| - Mode mode_;
|
| - int num_traces_recorded_;
|
| - scoped_ptr<TraceBuffer> logged_events_;
|
| - subtle::AtomicWord /* EventCallback */ event_callback_;
|
| - bool dispatching_to_observer_list_;
|
| - std::vector<EnabledStateObserver*> enabled_state_observer_list_;
|
| -
|
| - std::string process_name_;
|
| - base::hash_map<int, std::string> process_labels_;
|
| - int process_sort_index_;
|
| - base::hash_map<int, int> thread_sort_indices_;
|
| - base::hash_map<int, std::string> thread_names_;
|
| -
|
| - // The following two maps are used only when ECHO_TO_CONSOLE.
|
| - base::hash_map<int, std::stack<TimeTicks> > thread_event_start_times_;
|
| - base::hash_map<std::string, int> thread_colors_;
|
| -
|
| - TimeTicks buffer_limit_reached_timestamp_;
|
| -
|
| - // XORed with TraceID to make it unlikely to collide with other processes.
|
| - unsigned long long process_id_hash_;
|
| -
|
| - int process_id_;
|
| -
|
| - TimeDelta time_offset_;
|
| -
|
| - // Allow tests to wake up when certain events occur.
|
| - WatchEventCallback watch_event_callback_;
|
| - subtle::AtomicWord /* const unsigned char* */ watch_category_;
|
| - std::string watch_event_name_;
|
| -
|
| - subtle::AtomicWord /* Options */ trace_options_;
|
| -
|
| - // Sampling thread handles.
|
| - scoped_ptr<TraceSamplingThread> sampling_thread_;
|
| - PlatformThreadHandle sampling_thread_handle_;
|
| -
|
| - CategoryFilter category_filter_;
|
| - CategoryFilter event_callback_category_filter_;
|
| -
|
| - ThreadLocalPointer<ThreadLocalEventBuffer> thread_local_event_buffer_;
|
| - ThreadLocalBoolean thread_blocks_message_loop_;
|
| - ThreadLocalBoolean thread_is_in_trace_event_;
|
| -
|
| - // Contains the message loops of threads that have had at least one event
|
| - // added into the local event buffer. Not using MessageLoopProxy because we
|
| - // need to know the life time of the message loops.
|
| - hash_set<MessageLoop*> thread_message_loops_;
|
| -
|
| - // For events which can't be added into the thread local buffer, e.g. events
|
| - // from threads without a message loop.
|
| - scoped_ptr<TraceBufferChunk> thread_shared_chunk_;
|
| - size_t thread_shared_chunk_index_;
|
| -
|
| - // Set when asynchronous Flush is in progress.
|
| - OutputCallback flush_output_callback_;
|
| - scoped_refptr<MessageLoopProxy> flush_message_loop_proxy_;
|
| - subtle::AtomicWord generation_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(TraceLog);
|
| -};
|
| -
|
| -} // namespace debug
|
| -} // namespace base
|
| +#include "base/trace_event/trace_event_impl.h"
|
|
|
| #endif // BASE_DEBUG_TRACE_EVENT_IMPL_H_
|
|
|