| Index: base/trace_event/trace_event.h
 | 
| diff --git a/base/trace_event/trace_event.h b/base/trace_event/trace_event.h
 | 
| index faaccac8eaf34b40ff91b81e633df44246266a6a..320bb1d26e9b7d6066539c94410fcd0cf1a6f1d5 100644
 | 
| --- a/base/trace_event/trace_event.h
 | 
| +++ b/base/trace_event/trace_event.h
 | 
| @@ -195,6 +195,9 @@
 | 
|  #define TRACE_EVENT_API_ADD_METADATA_EVENT \
 | 
|      trace_event_internal::AddMetadataEvent
 | 
|  
 | 
| +#define TRACE_EVENT_API_ADD_METADATA_EVENT_WITH_TIMESTAMP \
 | 
| +  trace_event_internal::AddMetadataEventWithTimestamp
 | 
| +
 | 
|  // Defines atomic operations used internally by the tracing system.
 | 
|  #define TRACE_EVENT_API_ATOMIC_WORD base::subtle::AtomicWord
 | 
|  #define TRACE_EVENT_API_ATOMIC_LOAD(var) base::subtle::NoBarrier_Load(&(var))
 | 
| @@ -351,16 +354,33 @@ TRACE_EVENT_API_CLASS_EXPORT extern \
 | 
|  
 | 
|  // Implementation detail: internal macro to create static category and add
 | 
|  // metadata event if the category is enabled.
 | 
| -#define INTERNAL_TRACE_EVENT_METADATA_ADD(category_group, name, ...)        \
 | 
| +#define INTERNAL_TRACE_EVENT_METADATA_ADD_IF_ENABLED(category_group, name,  \
 | 
| +                                                     ...)                   \
 | 
|    do {                                                                      \
 | 
|      INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category_group);                 \
 | 
|      if (INTERNAL_TRACE_EVENT_CATEGORY_GROUP_ENABLED_FOR_RECORDING_MODE()) { \
 | 
|        TRACE_EVENT_API_ADD_METADATA_EVENT(                                   \
 | 
| +          TRACE_EVENT_PHASE_METADATA,                                       \
 | 
|            INTERNAL_TRACE_EVENT_UID(category_group_enabled), name,           \
 | 
|            ##__VA_ARGS__);                                                   \
 | 
|      }                                                                       \
 | 
|    } while (0)
 | 
|  
 | 
| +#define INTERNAL_TRACE_EVENT_METADATA_ADD_FORCED(phase, name, ...)             \
 | 
| +  do {                                                                         \
 | 
| +    TRACE_EVENT_API_ADD_METADATA_EVENT(                                        \
 | 
| +        phase, TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED("__metadata"), name, \
 | 
| +        ##__VA_ARGS__);                                                        \
 | 
| +  } while (0)
 | 
| +
 | 
| +#define INTERNAL_TRACE_EVENT_METADATA_ADD_FORCED_WITH_TIMESTAMP(               \
 | 
| +    phase, name, timestamp, ...)                                               \
 | 
| +  do {                                                                         \
 | 
| +    TRACE_EVENT_API_ADD_METADATA_EVENT_WITH_TIMESTAMP(                         \
 | 
| +        phase, TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED("__metadata"), name, \
 | 
| +        base::TimeTicks::FromInternalValue(timestamp), ##__VA_ARGS__);         \
 | 
| +  } while (0)
 | 
| +
 | 
|  // Implementation detail: internal macro to enter and leave a
 | 
|  // context based on the current scope.
 | 
|  #define INTERNAL_TRACE_EVENT_SCOPED_CONTEXT(category_group, name, context) \
 | 
| @@ -934,28 +954,70 @@ static inline base::trace_event::TraceEventHandle AddTraceEvent(
 | 
|  }
 | 
|  
 | 
|  template <class ARG1_CONVERTABLE_TYPE>
 | 
| -static inline void AddMetadataEvent(
 | 
| +static inline void AddMetadataEventWithTimestamp(
 | 
| +    char phase,
 | 
|      const unsigned char* category_group_enabled,
 | 
|      const char* event_name,
 | 
| +    const base::TimeTicks& timestamp,
 | 
|      const char* arg_name,
 | 
|      std::unique_ptr<ARG1_CONVERTABLE_TYPE> arg_value) {
 | 
|    const char* arg_names[1] = {arg_name};
 | 
|    unsigned char arg_types[1] = {TRACE_VALUE_TYPE_CONVERTABLE};
 | 
|    std::unique_ptr<base::trace_event::ConvertableToTraceFormat>
 | 
|        convertable_values[1] = {std::move(arg_value)};
 | 
| +
 | 
|    base::trace_event::TraceLog::GetInstance()->AddMetadataEvent(
 | 
| -      category_group_enabled, event_name,
 | 
| +      phase, category_group_enabled, event_name, timestamp,
 | 
|        1,  // num_args
 | 
|        arg_names, arg_types,
 | 
|        nullptr,  // arg_values
 | 
|        convertable_values, TRACE_EVENT_FLAG_NONE);
 | 
|  }
 | 
|  
 | 
| +template <class ARG1_TYPE, class ARG2_TYPE>
 | 
| +static inline void AddMetadataEventWithTimestamp(
 | 
| +    char phase,
 | 
| +    const unsigned char* category_group_enabled,
 | 
| +    const char* event_name,
 | 
| +    const base::TimeTicks& timestamp,
 | 
| +    const char* arg1_name,
 | 
| +    const ARG1_TYPE& arg1_val,
 | 
| +    const char* arg2_name,
 | 
| +    const ARG2_TYPE& arg2_val) {
 | 
| +  const int num_args = 2;
 | 
| +  const char* arg_names[2] = {arg1_name, arg2_name};
 | 
| +  unsigned char arg_types[2];
 | 
| +  unsigned long long arg_values[2];
 | 
| +  SetTraceValue(arg1_val, &arg_types[0], &arg_values[0]);
 | 
| +  SetTraceValue(arg2_val, &arg_types[1], &arg_values[1]);
 | 
| +  base::trace_event::TraceLog::GetInstance()->AddMetadataEvent(
 | 
| +      phase, category_group_enabled, event_name, timestamp, num_args, arg_names,
 | 
| +      arg_types, arg_values, nullptr, TRACE_EVENT_FLAG_NONE);
 | 
| +}
 | 
| +
 | 
| +template <class ARG1_TYPE, class ARG2_CONVERTABLE_TYPE>
 | 
| +static inline void AddMetadataEventWithTimestamp(
 | 
| +    char phase,
 | 
| +    const unsigned char* category_group_enabled,
 | 
| +    const char* event_name,
 | 
| +    const base::TimeTicks& timestamp,
 | 
| +    const char* arg1_name,
 | 
| +    const ARG1_TYPE& arg1_val,
 | 
| +    const char* arg2_name,
 | 
| +    std::unique_ptr<ARG2_CONVERTABLE_TYPE> arg2_val) {
 | 
| +  AddMetadataEventWithTimestamp(phase, category_group_enabled, event_name,
 | 
| +                                timestamp, arg1_name, arg1_val, arg2_name,
 | 
| +                                std::move(arg2_val));
 | 
| +}
 | 
| +
 | 
|  template <class ARG1_TYPE>
 | 
| -static void AddMetadataEvent(const unsigned char* category_group_enabled,
 | 
| -                             const char* event_name,
 | 
| -                             const char* arg_name,
 | 
| -                             const ARG1_TYPE& arg_val) {
 | 
| +static inline void AddMetadataEventWithTimestamp(
 | 
| +    char phase,
 | 
| +    const unsigned char* category_group_enabled,
 | 
| +    const char* event_name,
 | 
| +    const base::TimeTicks& timestamp,
 | 
| +    const char* arg_name,
 | 
| +    const ARG1_TYPE& arg_val) {
 | 
|    const int num_args = 1;
 | 
|    const char* arg_names[1] = {arg_name};
 | 
|    unsigned char arg_types[1];
 | 
| @@ -963,8 +1025,31 @@ static void AddMetadataEvent(const unsigned char* category_group_enabled,
 | 
|    SetTraceValue(arg_val, &arg_types[0], &arg_values[0]);
 | 
|  
 | 
|    base::trace_event::TraceLog::GetInstance()->AddMetadataEvent(
 | 
| -      category_group_enabled, event_name, num_args, arg_names, arg_types,
 | 
| -      arg_values, nullptr, TRACE_EVENT_FLAG_NONE);
 | 
| +      phase, category_group_enabled, event_name, timestamp, num_args, arg_names,
 | 
| +      arg_types, arg_values, nullptr, TRACE_EVENT_FLAG_NONE);
 | 
| +}
 | 
| +
 | 
| +template <class ARG1_CONVERTABLE_TYPE>
 | 
| +static inline void AddMetadataEvent(
 | 
| +    char phase,
 | 
| +    const unsigned char* category_group_enabled,
 | 
| +    const char* event_name,
 | 
| +    const char* arg_name,
 | 
| +    std::unique_ptr<ARG1_CONVERTABLE_TYPE> arg_value) {
 | 
| +  base::TimeTicks now = base::TimeTicks::Now();
 | 
| +  AddMetadataEventWithTimestamp(phase, category_group_enabled, event_name, now,
 | 
| +                                arg_name, std::move(arg_value));
 | 
| +}
 | 
| +
 | 
| +template <class ARG1_TYPE>
 | 
| +static void AddMetadataEvent(char phase,
 | 
| +                             const unsigned char* category_group_enabled,
 | 
| +                             const char* event_name,
 | 
| +                             const char* arg_name,
 | 
| +                             const ARG1_TYPE& arg_val) {
 | 
| +  base::TimeTicks now = base::TimeTicks::Now();
 | 
| +  AddMetadataEventWithTimestamp(phase, category_group_enabled, event_name, now,
 | 
| +                                arg_name, arg_val);
 | 
|  }
 | 
|  
 | 
|  // Used by TRACE_EVENTx macros. Do not use directly.
 | 
| 
 |