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