1 // Copyright 2019 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "services/tracing/public/cpp/perfetto/macros_internal.h"
6 
7 #include "base/trace_event/thread_instruction_count.h"
8 
9 namespace tracing {
10 namespace internal {
11 namespace {
12 
ThreadNow()13 base::ThreadTicks ThreadNow() {
14   return base::ThreadTicks::IsSupported()
15              ? base::subtle::ThreadTicksNowIgnoringOverride()
16              : base::ThreadTicks();
17 }
18 
ThreadInstructionNow()19 base::trace_event::ThreadInstructionCount ThreadInstructionNow() {
20   return base::trace_event::ThreadInstructionCount::IsSupported()
21              ? base::trace_event::ThreadInstructionCount::Now()
22              : base::trace_event::ThreadInstructionCount();
23 }
24 
25 }  // namespace
26 
CreateTraceEvent(char phase,const unsigned char * category_group_enabled,const char * name,unsigned int flags)27 base::Optional<base::trace_event::TraceEvent> CreateTraceEvent(
28     char phase,
29     const unsigned char* category_group_enabled,
30     const char* name,
31     unsigned int flags) {
32   DCHECK(phase == TRACE_EVENT_PHASE_BEGIN || phase == TRACE_EVENT_PHASE_END ||
33          phase == TRACE_EVENT_PHASE_INSTANT);
34   DCHECK(category_group_enabled);
35   const int thread_id = static_cast<int>(base::PlatformThread::CurrentId());
36   auto* trace_log = base::trace_event::TraceLog::GetInstance();
37   DCHECK(trace_log);
38   if (!trace_log->ShouldAddAfterUpdatingState(phase, category_group_enabled,
39                                               name, trace_event_internal::kNoId,
40                                               thread_id, nullptr)) {
41     return base::nullopt;
42   }
43 
44   base::TimeTicks now = TRACE_TIME_TICKS_NOW();
45   base::TimeTicks offset_event_timestamp = now - base::TimeDelta();
46   base::ThreadTicks thread_now = ThreadNow();
47   base::trace_event::ThreadInstructionCount thread_instruction_now =
48       ThreadInstructionNow();
49 
50   return base::trace_event::TraceEvent(
51       thread_id, offset_event_timestamp, thread_now, thread_instruction_now,
52       phase, category_group_enabled, name, trace_event_internal::kGlobalScope,
53       trace_event_internal::kNoId, trace_event_internal::kNoId, nullptr, flags);
54 }
55 
56 }  // namespace internal
57 }  // namespace tracing
58