diff options
Diffstat (limited to 'base/trace_event/trace_event_impl.cc')
-rw-r--r-- | base/trace_event/trace_event_impl.cc | 68 |
1 files changed, 66 insertions, 2 deletions
diff --git a/base/trace_event/trace_event_impl.cc b/base/trace_event/trace_event_impl.cc index f469f2f6bc..cb23eb474c 100644 --- a/base/trace_event/trace_event_impl.cc +++ b/base/trace_event/trace_event_impl.cc @@ -8,6 +8,7 @@ #include "base/format_macros.h" #include "base/json/string_escape.h" +#include "base/memory/ptr_util.h" #include "base/process/process_handle.h" #include "base/stl_util.h" #include "base/strings/string_number_conversions.h" @@ -15,6 +16,7 @@ #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "base/trace_event/trace_event.h" +#include "base/trace_event/trace_event_argument.h" #include "base/trace_event/trace_log.h" namespace base { @@ -358,10 +360,33 @@ void TraceEvent::AppendAsJSON( // If id_ is set, print it out as a hex string so we don't loose any // bits (it might be a 64-bit pointer). - if (flags_ & TRACE_EVENT_FLAG_HAS_ID) { + unsigned int id_flags_ = flags_ & (TRACE_EVENT_FLAG_HAS_ID | + TRACE_EVENT_FLAG_HAS_LOCAL_ID | + TRACE_EVENT_FLAG_HAS_GLOBAL_ID); + if (id_flags_) { if (scope_ != trace_event_internal::kGlobalScope) StringAppendF(out, ",\"scope\":\"%s\"", scope_); - StringAppendF(out, ",\"id\":\"0x%" PRIx64 "\"", static_cast<uint64_t>(id_)); + + switch (id_flags_) { + case TRACE_EVENT_FLAG_HAS_ID: + StringAppendF(out, ",\"id\":\"0x%" PRIx64 "\"", + static_cast<uint64_t>(id_)); + break; + + case TRACE_EVENT_FLAG_HAS_LOCAL_ID: + StringAppendF(out, ",\"id2\":{\"local\":\"0x%" PRIx64 "\"}", + static_cast<uint64_t>(id_)); + break; + + case TRACE_EVENT_FLAG_HAS_GLOBAL_ID: + StringAppendF(out, ",\"id2\":{\"global\":\"0x%" PRIx64 "\"}", + static_cast<uint64_t>(id_)); + break; + + default: + NOTREACHED() << "More than one of the ID flags are set"; + break; + } } if (flags_ & TRACE_EVENT_FLAG_BIND_TO_ENCLOSING) @@ -424,3 +449,42 @@ void TraceEvent::AppendPrettyPrinted(std::ostringstream* out) const { } // namespace trace_event } // namespace base + +namespace trace_event_internal { + +std::unique_ptr<base::trace_event::ConvertableToTraceFormat> +TraceID::AsConvertableToTraceFormat() const { + auto value = base::MakeUnique<base::trace_event::TracedValue>(); + + if (scope_ != kGlobalScope) + value->SetString("scope", scope_); + + const char* id_field_name = "id"; + if (id_flags_ == TRACE_EVENT_FLAG_HAS_GLOBAL_ID) { + id_field_name = "global"; + value->BeginDictionary("id2"); + } else if (id_flags_ == TRACE_EVENT_FLAG_HAS_LOCAL_ID) { + id_field_name = "local"; + value->BeginDictionary("id2"); + } else if (id_flags_ != TRACE_EVENT_FLAG_HAS_ID) { + NOTREACHED() << "Unrecognized ID flag"; + } + + if (has_prefix_) { + value->SetString(id_field_name, + base::StringPrintf("0x%" PRIx64 "/0x%" PRIx64, + static_cast<uint64_t>(prefix_), + static_cast<uint64_t>(raw_id_))); + } else { + value->SetString( + id_field_name, + base::StringPrintf("0x%" PRIx64, static_cast<uint64_t>(raw_id_))); + } + + if (id_flags_ != TRACE_EVENT_FLAG_HAS_ID) + value->EndDictionary(); + + return std::move(value); +} + +} // namespace trace_event_internal |