| Index: base/debug/trace_event.h
 | 
| diff --git a/base/debug/trace_event.h b/base/debug/trace_event.h
 | 
| index a1fff3e66d78645080008dc19dc75bda57e9b673..21d1b32b7e74481bbf19ca2bf14ac69c67964268 100644
 | 
| --- a/base/debug/trace_event.h
 | 
| +++ b/base/debug/trace_event.h
 | 
| @@ -2,6 +2,13 @@
 | 
|  // Use of this source code is governed by a BSD-style license that can be
 | 
|  // found in the LICENSE file.
 | 
|  
 | 
| +// This header is designed to give you trace_event macros without specifying
 | 
| +// how the events actually get collected and stored. If you need to expose trace
 | 
| +// event to some other universe, you can copy-and-paste this file,
 | 
| +// implement the TRACE_EVENT_API macros, and do any other necessary fixup for
 | 
| +// the target platform. The end result is that multiple libraries can funnel
 | 
| +// events through to a shared trace event collector.
 | 
| +
 | 
|  // Trace events are for tracking application performance and resource usage.
 | 
|  // Macros are provided to track:
 | 
|  //    Begin and end of function calls
 | 
| @@ -147,87 +154,16 @@
 | 
|  #define BASE_DEBUG_TRACE_EVENT_H_
 | 
|  #pragma once
 | 
|  
 | 
| -#include "build/build_config.h"
 | 
| -
 | 
|  #include <string>
 | 
| -#include <vector>
 | 
| -
 | 
| -#include "base/callback.h"
 | 
| -#include "base/hash_tables.h"
 | 
| -#include "base/memory/ref_counted_memory.h"
 | 
| -#include "base/string_util.h"
 | 
| -#include "base/synchronization/lock.h"
 | 
| -#include "base/third_party/dynamic_annotations/dynamic_annotations.h"
 | 
| -#include "base/timer.h"
 | 
|  
 | 
| -////////////////////////////////////////////////////////////////////////////////
 | 
| -// TODO(jbates): split this into a separate header.
 | 
| -// This header is designed to be give you trace_event macros without specifying
 | 
| -// how the events actually get collected and stored. If you need to expose trace
 | 
| -// event to some other universe, you can copy-and-paste this file and just
 | 
| -// implement these API macros.
 | 
| -
 | 
| -// unsigned char*
 | 
| -//     TRACE_EVENT_API_GET_CATEGORY_ENABLED(const char* category_name)
 | 
| -#define TRACE_EVENT_API_GET_CATEGORY_ENABLED \
 | 
| -    base::debug::TraceLog::GetCategoryEnabled
 | 
| -
 | 
| -// Returns the threshold_begin_id used by TRACE_IF_LONGER_THAN macros.
 | 
| -// int TRACE_EVENT_API_ADD_TRACE_EVENT(
 | 
| -//                    char phase,
 | 
| -//                    const unsigned char* category_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,
 | 
| -//                    int threshold_begin_id,
 | 
| -//                    long long threshold,
 | 
| -//                    unsigned char flags)
 | 
| -#define TRACE_EVENT_API_ADD_TRACE_EVENT \
 | 
| -    base::debug::TraceLog::GetInstance()->AddTraceEvent
 | 
| -
 | 
| -// void TRACE_EVENT_API_ADD_COUNTER_EVENT(
 | 
| -//                    const unsigned char* category_enabled,
 | 
| -//                    const char* name,
 | 
| -//                    unsigned long long id,
 | 
| -//                    const char* arg1_name, int arg1_val,
 | 
| -//                    const char* arg2_name, int arg2_val,
 | 
| -//                    unsigned char flags)
 | 
| -#define TRACE_EVENT_API_ADD_COUNTER_EVENT \
 | 
| -    base::debug::TraceLog::GetInstance()->AddCounterEvent
 | 
| -
 | 
| -// Mangle |pointer| with a process ID hash so that if |pointer| occurs on more
 | 
| -// than one process, it will not collide in the trace data.
 | 
| -// unsigned long long TRACE_EVENT_API_GET_ID_FROM_POINTER(void* pointer)
 | 
| -#define TRACE_EVENT_API_GET_ID_FROM_POINTER \
 | 
| -    base::debug::TraceLog::GetInstance()->GetInterProcessID
 | 
| -
 | 
| -////////////////////////////////////////////////////////////////////////////////
 | 
| +#include "build/build_config.h"
 | 
| +#include "base/debug/trace_event_impl.h"
 | 
|  
 | 
|  // By default, const char* argument values are assumed to have long-lived scope
 | 
|  // and will not be copied. Use this macro to force a const char* to be copied.
 | 
|  #define TRACE_STR_COPY(str) \
 | 
|      trace_event_internal::TraceStringWithCopy(str)
 | 
|  
 | 
| -// 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)
 | 
| -
 | 
|  // Records a pair of begin and end events called "name" for the current
 | 
|  // scope, with 0, 1 or 2 associated arguments. If the category is not
 | 
|  // enabled, then this does nothing.
 | 
| @@ -377,9 +313,13 @@
 | 
|  // - category and name strings must have application lifetime (statics or
 | 
|  //   literals). They may not include " chars.
 | 
|  #define TRACE_COUNTER1(category, name, value) \
 | 
| -    TRACE_COUNTER2(category, name, "value", value, NULL, 0)
 | 
| +    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_COUNTER, \
 | 
| +        category, name, TRACE_EVENT_FLAG_NONE, \
 | 
| +        "value", static_cast<int>(value))
 | 
|  #define TRACE_COPY_COUNTER1(category, name, value) \
 | 
| -    TRACE_COPY_COUNTER2(category, name, "value", value, NULL, 0)
 | 
| +    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_COUNTER, \
 | 
| +        category, name, TRACE_EVENT_FLAG_COPY, \
 | 
| +        "value", static_cast<int>(value))
 | 
|  
 | 
|  // Records the values of a multi-parted counter called "name" immediately.
 | 
|  // The UI will treat value1 and value2 as parts of a whole, displaying their
 | 
| @@ -388,16 +328,16 @@
 | 
|  //   literals). They may not include " chars.
 | 
|  #define TRACE_COUNTER2(category, name, value1_name, value1_val, \
 | 
|          value2_name, value2_val) \
 | 
| -    INTERNAL_TRACE_EVENT_ADD_COUNTER( \
 | 
| -        category, name, trace_event_internal::kNoEventId, \
 | 
| -        value1_name, value1_val, value2_name, value2_val, \
 | 
| -        TRACE_EVENT_FLAG_NONE)
 | 
| +    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_COUNTER, \
 | 
| +        category, name, TRACE_EVENT_FLAG_NONE, \
 | 
| +        value1_name, static_cast<int>(value1_val), \
 | 
| +        value2_name, static_cast<int>(value2_val))
 | 
|  #define TRACE_COPY_COUNTER2(category, name, value1_name, value1_val, \
 | 
|          value2_name, value2_val) \
 | 
| -    INTERNAL_TRACE_EVENT_ADD_COUNTER( \
 | 
| -        category, name, trace_event_internal::kNoEventId, \
 | 
| -        value1_name, value1_val, value2_name, value2_val, \
 | 
| -        TRACE_EVENT_FLAG_COPY)
 | 
| +    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_COUNTER, \
 | 
| +        category, name, TRACE_EVENT_FLAG_COPY, \
 | 
| +        value1_name, static_cast<int>(value1_val), \
 | 
| +        value2_name, static_cast<int>(value2_val))
 | 
|  
 | 
|  // Records the value of a counter called "name" immediately. Value
 | 
|  // must be representable as a 32 bit integer.
 | 
| @@ -408,9 +348,13 @@
 | 
|  //   will be xored with a hash of the process ID so that the same pointer on
 | 
|  //   two different processes will not collide.
 | 
|  #define TRACE_COUNTER_ID1(category, name, id, value) \
 | 
| -    TRACE_COUNTER_ID2(category, name, id, "value", value, NULL, 0)
 | 
| +    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_COUNTER, \
 | 
| +        category, name, id, TRACE_EVENT_FLAG_HAS_ID, \
 | 
| +        "value", static_cast<int>(value))
 | 
|  #define TRACE_COPY_COUNTER_ID1(category, name, id, value) \
 | 
| -    TRACE_COPY_COUNTER_ID2(category, name, id, "value", value, NULL, 0)
 | 
| +    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_COUNTER, \
 | 
| +        category, name, id, TRACE_EVENT_FLAG_COPY | TRACE_EVENT_FLAG_HAS_ID, \
 | 
| +        "value", static_cast<int>(value))
 | 
|  
 | 
|  // Records the values of a multi-parted counter called "name" immediately.
 | 
|  // The UI will treat value1 and value2 as parts of a whole, displaying their
 | 
| @@ -423,16 +367,16 @@
 | 
|  //   two different processes will not collide.
 | 
|  #define TRACE_COUNTER_ID2(category, name, id, value1_name, value1_val, \
 | 
|          value2_name, value2_val) \
 | 
| -    INTERNAL_TRACE_EVENT_ADD_COUNTER( \
 | 
| -        category, name, id, value1_name, value1_val, value2_name, value2_val, \
 | 
| -        TRACE_EVENT_FLAG_HAS_ID)
 | 
| +    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_COUNTER, \
 | 
| +        category, name, id, TRACE_EVENT_FLAG_HAS_ID, \
 | 
| +        value1_name, static_cast<int>(value1_val), \
 | 
| +        value2_name, static_cast<int>(value2_val))
 | 
|  #define TRACE_COPY_COUNTER_ID2(category, name, id, value1_name, value1_val, \
 | 
|          value2_name, value2_val) \
 | 
| -    INTERNAL_TRACE_EVENT_ADD_COUNTER( \
 | 
| -        category, name, id, \
 | 
| -        value1_name, value1_val, \
 | 
| -        value2_name, value2_val, \
 | 
| -        TRACE_EVENT_FLAG_COPY|TRACE_EVENT_FLAG_HAS_ID)
 | 
| +    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_COUNTER, \
 | 
| +        category, name, id, TRACE_EVENT_FLAG_COPY | TRACE_EVENT_FLAG_HAS_ID, \
 | 
| +        value1_name, static_cast<int>(value1_val), \
 | 
| +        value2_name, static_cast<int>(value2_val))
 | 
|  
 | 
|  
 | 
|  // Records a single START event called "name" immediately, with 0, 1 or 2
 | 
| @@ -495,6 +439,48 @@
 | 
|          arg1_name, arg1_val, arg2_name, arg2_val)
 | 
|  
 | 
|  
 | 
| +////////////////////////////////////////////////////////////////////////////////
 | 
| +// Implementation specific tracing API definitions.
 | 
| +
 | 
| +// const unsigned char*
 | 
| +//     TRACE_EVENT_API_GET_CATEGORY_ENABLED(const char* category_name)
 | 
| +#define TRACE_EVENT_API_GET_CATEGORY_ENABLED \
 | 
| +    base::debug::TraceLog::GetCategoryEnabled
 | 
| +
 | 
| +// Returns the threshold_begin_id used by TRACE_IF_LONGER_THAN macros.
 | 
| +// int TRACE_EVENT_API_ADD_TRACE_EVENT(
 | 
| +//                    char phase,
 | 
| +//                    const unsigned char* category_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,
 | 
| +//                    int threshold_begin_id,
 | 
| +//                    long long threshold,
 | 
| +//                    unsigned char flags)
 | 
| +#define TRACE_EVENT_API_ADD_TRACE_EVENT \
 | 
| +    base::debug::TraceLog::GetInstance()->AddTraceEvent
 | 
| +
 | 
| +// void TRACE_EVENT_API_ADD_COUNTER_EVENT(
 | 
| +//                    const unsigned char* category_enabled,
 | 
| +//                    const char* name,
 | 
| +//                    unsigned long long id,
 | 
| +//                    const char* arg1_name, int arg1_val,
 | 
| +//                    const char* arg2_name, int arg2_val,
 | 
| +//                    unsigned char flags)
 | 
| +#define TRACE_EVENT_API_ADD_COUNTER_EVENT \
 | 
| +    base::debug::TraceLog::GetInstance()->AddCounterEvent
 | 
| +
 | 
| +// Mangle |pointer| with a process ID hash so that if |pointer| occurs on more
 | 
| +// than one process, it will not collide in the trace data.
 | 
| +// unsigned long long TRACE_EVENT_API_GET_ID_FROM_POINTER(void* pointer)
 | 
| +#define TRACE_EVENT_API_GET_ID_FROM_POINTER \
 | 
| +    base::debug::TraceLog::GetInstance()->GetInterProcessID
 | 
| +
 | 
| +////////////////////////////////////////////////////////////////////////////////
 | 
| +
 | 
|  // Implementation detail: trace event macros create temporary variables
 | 
|  // to keep instrumentation overhead low. These macros give each temporary
 | 
|  // variable a unique name based on the line number to prevent name collissions.
 | 
| @@ -525,18 +511,6 @@
 | 
|            trace_event_internal::kNoEventId, flags, ##__VA_ARGS__); \
 | 
|      }
 | 
|  
 | 
| -// Implementation detail: internal macro to create static category and
 | 
| -// add the counter event if it is enabled.
 | 
| -#define INTERNAL_TRACE_EVENT_ADD_COUNTER( \
 | 
| -      category, name, id, arg1_name, arg1_val, arg2_name, arg2_val, flags) \
 | 
| -    INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category); \
 | 
| -    if (*INTERNAL_TRACE_EVENT_UID(catstatic)) { \
 | 
| -      TRACE_EVENT_API_ADD_COUNTER_EVENT( \
 | 
| -          INTERNAL_TRACE_EVENT_UID(catstatic), \
 | 
| -          name, trace_event_internal::TraceID(id).data(), \
 | 
| -          arg1_name, arg1_val, arg2_name, arg2_val, flags); \
 | 
| -    }
 | 
| -
 | 
|  // Implementation detail: internal macro to create static category and add begin
 | 
|  // event if the category is enabled. Also adds the end event when the scope
 | 
|  // ends.
 | 
| @@ -586,17 +560,6 @@
 | 
|            ##__VA_ARGS__); \
 | 
|      }
 | 
|  
 | 
| -template <typename Type>
 | 
| -struct StaticMemorySingletonTraits;
 | 
| -
 | 
| -namespace base {
 | 
| -
 | 
| -class RefCountedString;
 | 
| -
 | 
| -namespace debug {
 | 
| -
 | 
| -const int kTraceMaxNumArgs = 2;
 | 
| -
 | 
|  // Notes regarding the following definitions:
 | 
|  // New values can be added and propagated to third party libraries, but existing
 | 
|  // definitions must never be changed, because third party libraries may use old
 | 
| @@ -625,275 +588,6 @@ const int kTraceMaxNumArgs = 2;
 | 
|  #define TRACE_VALUE_TYPE_STRING       (static_cast<unsigned char>(6))
 | 
|  #define TRACE_VALUE_TYPE_COPY_STRING  (static_cast<unsigned char>(7))
 | 
|  
 | 
| -// Output records are "Events" and can be obtained via the
 | 
| -// OutputCallback whenever the tracing system decides to flush. This
 | 
| -// can happen at any time, on any thread, or you can programatically
 | 
| -// force it to happen.
 | 
| -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(int thread_id,
 | 
| -             TimeTicks timestamp,
 | 
| -             char phase,
 | 
| -             const unsigned char* category_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,
 | 
| -             unsigned char flags);
 | 
| -  ~TraceEvent();
 | 
| -
 | 
| -  // Serialize event data to JSON
 | 
| -  static void AppendEventsAsJSON(const std::vector<TraceEvent>& events,
 | 
| -                                 size_t start,
 | 
| -                                 size_t count,
 | 
| -                                 std::string* out);
 | 
| -  void AppendAsJSON(std::string* out) const;
 | 
| -
 | 
| -  TimeTicks timestamp() const { return timestamp_; }
 | 
| -
 | 
| -  // Exposed for unittesting:
 | 
| -
 | 
| -  const base::RefCountedString* parameter_copy_storage() const {
 | 
| -    return parameter_copy_storage_.get();
 | 
| -  }
 | 
| -
 | 
| -  const char* name() const { return name_; }
 | 
| -
 | 
| - private:
 | 
| -  // Note: these are ordered by size (largest first) for optimal packing.
 | 
| -  TimeTicks timestamp_;
 | 
| -  // id_ can be used to store phase-specific data.
 | 
| -  unsigned long long id_;
 | 
| -  TraceValue arg_values_[kTraceMaxNumArgs];
 | 
| -  const char* arg_names_[kTraceMaxNumArgs];
 | 
| -  const unsigned char* category_enabled_;
 | 
| -  const char* name_;
 | 
| -  scoped_refptr<base::RefCountedString> parameter_copy_storage_;
 | 
| -  int thread_id_;
 | 
| -  char phase_;
 | 
| -  unsigned char flags_;
 | 
| -  unsigned char arg_types_[kTraceMaxNumArgs];
 | 
| -};
 | 
| -
 | 
| -
 | 
| -// 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 TraceLog {
 | 
| - public:
 | 
| -  static TraceLog* GetInstance();
 | 
| -
 | 
| -  // Get set of known categories. This can change as new code paths are reached.
 | 
| -  // The known categories are inserted into |categories|.
 | 
| -  void GetKnownCategories(std::vector<std::string>* categories);
 | 
| -
 | 
| -  // Enable tracing for provided list of categories. If tracing is already
 | 
| -  // enabled, this method does nothing -- changing categories during trace is
 | 
| -  // not supported.
 | 
| -  // If both included_categories and excluded_categories are empty,
 | 
| -  //   all categories are traced.
 | 
| -  // Else if included_categories is non-empty, only those are traced.
 | 
| -  // Else if excluded_categories is non-empty, everything but those are traced.
 | 
| -  // Wildcards * and ? are supported (see MatchPattern in string_util.h).
 | 
| -  void SetEnabled(const std::vector<std::string>& included_categories,
 | 
| -                  const std::vector<std::string>& excluded_categories);
 | 
| -
 | 
| -  // |categories| 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: SetEnabled("test_MyTest*");
 | 
| -  // Example: SetEnabled("test_MyTest*,test_OtherStuff");
 | 
| -  // Example: SetEnabled("-excluded_category1,-excluded_category2");
 | 
| -  void SetEnabled(const std::string& categories);
 | 
| -
 | 
| -  // Retieves the categories set via a prior call to SetEnabled(). Only
 | 
| -  // meaningful if |IsEnabled()| is true.
 | 
| -  void GetEnabledTraceCategories(std::vector<std::string>* included_out,
 | 
| -                                 std::vector<std::string>* excluded_out);
 | 
| -
 | 
| -  // Disable tracing for all categories.
 | 
| -  void SetDisabled();
 | 
| -  // Helper method to enable/disable tracing for all categories.
 | 
| -  void SetEnabled(bool enabled);
 | 
| -  bool IsEnabled() { return enabled_; }
 | 
| -
 | 
| -  float GetBufferPercentFull() const;
 | 
| -
 | 
| -  // When enough events are collected, they are handed (in bulk) to
 | 
| -  // the output callback. If no callback is set, the output will be
 | 
| -  // silently dropped. The callback must be thread safe. The string format is
 | 
| -  // undefined. Use TraceResultBuffer to convert one or more trace strings to
 | 
| -  // JSON.
 | 
| -  typedef RefCountedData<std::string> RefCountedString;
 | 
| -  typedef base::Callback<void(const scoped_refptr<RefCountedString>&)>
 | 
| -      OutputCallback;
 | 
| -  void SetOutputCallback(const OutputCallback& cb);
 | 
| -
 | 
| -  // The trace buffer does not flush dynamically, so when it fills up,
 | 
| -  // subsequent trace events will be dropped. This callback is generated when
 | 
| -  // the trace buffer is full. The callback must be thread safe.
 | 
| -  typedef base::Callback<void(void)> BufferFullCallback;
 | 
| -  void SetBufferFullCallback(const BufferFullCallback& cb);
 | 
| -
 | 
| -  // Flushes all logged data to the callback.
 | 
| -  void Flush();
 | 
| -
 | 
| -  // Called by TRACE_EVENT* macros, don't call this directly.
 | 
| -  static const unsigned char* GetCategoryEnabled(const char* name);
 | 
| -  static const char* GetCategoryName(const unsigned char* category_enabled);
 | 
| -
 | 
| -  // Called by TRACE_EVENT* macros, don't call this directly.
 | 
| -  // Returns the index in the internal vector of the event if it was added, or
 | 
| -  //         -1 if the event was not added.
 | 
| -  // On end events, the return value of the begin event can be specified along
 | 
| -  // with a threshold in microseconds. If the elapsed time between begin and end
 | 
| -  // is less than the threshold, the begin/end event pair is dropped.
 | 
| -  // 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.
 | 
| -  int AddTraceEvent(char phase,
 | 
| -                    const unsigned char* category_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,
 | 
| -                    int threshold_begin_id,
 | 
| -                    long long threshold,
 | 
| -                    unsigned char flags);
 | 
| -  static void AddTraceEventEtw(char phase,
 | 
| -                               const char* name,
 | 
| -                               const void* id,
 | 
| -                               const char* extra);
 | 
| -  static void AddTraceEventEtw(char phase,
 | 
| -                               const char* name,
 | 
| -                               const void* id,
 | 
| -                               const std::string& extra);
 | 
| -
 | 
| -  // A wrapper around AddTraceEvent used by TRACE_COUNTERx macros
 | 
| -  // that allows only integer values for the counters.
 | 
| -  void AddCounterEvent(const unsigned char* category_enabled,
 | 
| -                       const char* name,
 | 
| -                       unsigned long long id,
 | 
| -                       const char* arg1_name, int arg1_val,
 | 
| -                       const char* arg2_name, int arg2_val,
 | 
| -                       unsigned char flags);
 | 
| -
 | 
| -  // Mangle |ptr| with a hash based on the process ID so that if |ptr| occurs on
 | 
| -  // more than one process, it will not collide.
 | 
| -  unsigned long long GetInterProcessID(void* ptr) const {
 | 
| -    return static_cast<unsigned long long>(reinterpret_cast<uintptr_t>(ptr)) ^
 | 
| -           process_id_hash_;
 | 
| -  }
 | 
| -
 | 
| -  int process_id() const { return process_id_; }
 | 
| -
 | 
| -  // Exposed for unittesting:
 | 
| -
 | 
| -  // Allows deleting our singleton instance.
 | 
| -  static void DeleteForTesting();
 | 
| -
 | 
| -  // Allows resurrecting our singleton instance post-AtExit processing.
 | 
| -  static void Resurrect();
 | 
| -
 | 
| -  // Allow tests to inspect TraceEvents.
 | 
| -  size_t GetEventsSize() const { return logged_events_.size(); }
 | 
| -  const TraceEvent& GetEventAt(size_t index) const {
 | 
| -    DCHECK(index < logged_events_.size());
 | 
| -    return logged_events_[index];
 | 
| -  }
 | 
| -
 | 
| -  void SetProcessID(int process_id);
 | 
| -
 | 
| - private:
 | 
| -  // This allows constructor and destructor to be private and usable only
 | 
| -  // by the Singleton class.
 | 
| -  friend struct StaticMemorySingletonTraits<TraceLog>;
 | 
| -
 | 
| -  TraceLog();
 | 
| -  ~TraceLog();
 | 
| -  const unsigned char* GetCategoryEnabledInternal(const char* name);
 | 
| -  void AddThreadNameMetadataEvents();
 | 
| -  void AddClockSyncMetadataEvents();
 | 
| -
 | 
| -  // TODO(nduca): switch to per-thread trace buffers to reduce thread
 | 
| -  // synchronization.
 | 
| -  Lock lock_;
 | 
| -  bool enabled_;
 | 
| -  OutputCallback output_callback_;
 | 
| -  BufferFullCallback buffer_full_callback_;
 | 
| -  std::vector<TraceEvent> logged_events_;
 | 
| -  std::vector<std::string> included_categories_;
 | 
| -  std::vector<std::string> excluded_categories_;
 | 
| -
 | 
| -  base::hash_map<int, std::string> thread_names_;
 | 
| -
 | 
| -  // XORed with TraceID to make it unlikely to collide with other processes.
 | 
| -  unsigned long long process_id_hash_;
 | 
| -
 | 
| -  int process_id_;
 | 
| -
 | 
| -  DISALLOW_COPY_AND_ASSIGN(TraceLog);
 | 
| -};
 | 
| -
 | 
| -}  // namespace debug
 | 
| -}  // namespace base
 | 
| -
 | 
|  namespace trace_event_internal {
 | 
|  
 | 
|  // Specify these values when the corresponding argument of AddTraceEvent is not
 | 
| 
 |