1 // Copyright 2016 The Chromium Authors
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 "base/android/early_trace_event_binding.h"
6
7 #include <stdint.h>
8
9 #include "base/android/jni_string.h"
10 #include "base/android/trace_event_binding.h"
11 #include "base/time/time.h"
12 #include "base/trace_event/base_tracing.h"
13 #include "base/tracing_buildflags.h"
14
15 // Must come after all headers that specialize FromJniType() / ToJniType().
16 #include "base/tasks_jni/EarlyTraceEvent_jni.h"
17
18 namespace base {
19 namespace android {
20
JNI_EarlyTraceEvent_RecordEarlyBeginEvent(JNIEnv * env,const JavaParamRef<jstring> & jname,jlong time_ns,jint thread_id,jlong thread_time_ms)21 static void JNI_EarlyTraceEvent_RecordEarlyBeginEvent(
22 JNIEnv* env,
23 const JavaParamRef<jstring>& jname,
24 jlong time_ns,
25 jint thread_id,
26 jlong thread_time_ms) {
27 #if BUILDFLAG(ENABLE_BASE_TRACING)
28 std::string name = ConvertJavaStringToUTF8(env, jname);
29
30 static const unsigned char* category_group_enabled =
31 TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED(internal::kJavaTraceCategory);
32 trace_event_internal::AddTraceEventWithThreadIdAndTimestamps(
33 TRACE_EVENT_PHASE_BEGIN, category_group_enabled, name.c_str(),
34 /*scope=*/nullptr, trace_event_internal::kNoId, thread_id,
35 TimeTicks::FromJavaNanoTime(time_ns),
36 ThreadTicks() + Milliseconds(thread_time_ms),
37 TRACE_EVENT_FLAG_JAVA_STRING_LITERALS | TRACE_EVENT_FLAG_COPY);
38 #endif // BUILDFLAG(ENABLE_BASE_TRACING)
39 }
40
JNI_EarlyTraceEvent_RecordEarlyEndEvent(JNIEnv * env,const JavaParamRef<jstring> & jname,jlong time_ns,jint thread_id,jlong thread_time_ms)41 static void JNI_EarlyTraceEvent_RecordEarlyEndEvent(
42 JNIEnv* env,
43 const JavaParamRef<jstring>& jname,
44 jlong time_ns,
45 jint thread_id,
46 jlong thread_time_ms) {
47 #if BUILDFLAG(ENABLE_BASE_TRACING)
48 std::string name = ConvertJavaStringToUTF8(env, jname);
49
50 static const unsigned char* category_group_enabled =
51 TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED(internal::kJavaTraceCategory);
52 trace_event_internal::AddTraceEventWithThreadIdAndTimestamps(
53 TRACE_EVENT_PHASE_END, category_group_enabled, name.c_str(),
54 /*scope=*/nullptr, trace_event_internal::kNoId, thread_id,
55 TimeTicks::FromJavaNanoTime(time_ns),
56 ThreadTicks() + Milliseconds(thread_time_ms),
57 TRACE_EVENT_FLAG_JAVA_STRING_LITERALS | TRACE_EVENT_FLAG_COPY);
58 #endif // BUILDFLAG(ENABLE_BASE_TRACING)
59 }
60
JNI_EarlyTraceEvent_RecordEarlyToplevelBeginEvent(JNIEnv * env,const JavaParamRef<jstring> & jname,jlong time_ns,jint thread_id,jlong thread_time_ms)61 static void JNI_EarlyTraceEvent_RecordEarlyToplevelBeginEvent(
62 JNIEnv* env,
63 const JavaParamRef<jstring>& jname,
64 jlong time_ns,
65 jint thread_id,
66 jlong thread_time_ms) {
67 #if BUILDFLAG(ENABLE_BASE_TRACING)
68 std::string name = ConvertJavaStringToUTF8(env, jname);
69
70 static const unsigned char* category_group_enabled =
71 TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED(
72 internal::kToplevelTraceCategory);
73 trace_event_internal::AddTraceEventWithThreadIdAndTimestamps(
74 TRACE_EVENT_PHASE_BEGIN, category_group_enabled, name.c_str(),
75 /*scope=*/nullptr, trace_event_internal::kNoId, thread_id,
76 TimeTicks::FromJavaNanoTime(time_ns),
77 ThreadTicks() + Milliseconds(thread_time_ms),
78 TRACE_EVENT_FLAG_JAVA_STRING_LITERALS | TRACE_EVENT_FLAG_COPY);
79 #endif // BUILDFLAG(ENABLE_BASE_TRACING)
80 }
81
JNI_EarlyTraceEvent_RecordEarlyToplevelEndEvent(JNIEnv * env,const JavaParamRef<jstring> & jname,jlong time_ns,jint thread_id,jlong thread_time_ms)82 static void JNI_EarlyTraceEvent_RecordEarlyToplevelEndEvent(
83 JNIEnv* env,
84 const JavaParamRef<jstring>& jname,
85 jlong time_ns,
86 jint thread_id,
87 jlong thread_time_ms) {
88 #if BUILDFLAG(ENABLE_BASE_TRACING)
89 std::string name = ConvertJavaStringToUTF8(env, jname);
90
91 static const unsigned char* category_group_enabled =
92 TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED(
93 internal::kToplevelTraceCategory);
94 trace_event_internal::AddTraceEventWithThreadIdAndTimestamps(
95 TRACE_EVENT_PHASE_END, category_group_enabled, name.c_str(),
96 /*scope=*/nullptr, trace_event_internal::kNoId, thread_id,
97 TimeTicks::FromJavaNanoTime(time_ns),
98 ThreadTicks() + Milliseconds(thread_time_ms),
99 TRACE_EVENT_FLAG_JAVA_STRING_LITERALS | TRACE_EVENT_FLAG_COPY);
100 #endif // BUILDFLAG(ENABLE_BASE_TRACING)
101 }
102
JNI_EarlyTraceEvent_RecordEarlyAsyncBeginEvent(JNIEnv * env,const JavaParamRef<jstring> & jname,jlong id,jlong time_ns)103 static void JNI_EarlyTraceEvent_RecordEarlyAsyncBeginEvent(
104 JNIEnv* env,
105 const JavaParamRef<jstring>& jname,
106 jlong id,
107 jlong time_ns) {
108 TRACE_EVENT_BEGIN(internal::kJavaTraceCategory, nullptr,
109 perfetto::Track(static_cast<uint64_t>(id)),
110 TimeTicks::FromJavaNanoTime(time_ns),
111 [&](::perfetto::EventContext& ctx) {
112 std::string name = ConvertJavaStringToUTF8(env, jname);
113 ctx.event()->set_name(name.c_str());
114 });
115 }
116
JNI_EarlyTraceEvent_RecordEarlyAsyncEndEvent(JNIEnv * env,jlong id,jlong time_ns)117 static void JNI_EarlyTraceEvent_RecordEarlyAsyncEndEvent(JNIEnv* env,
118 jlong id,
119 jlong time_ns) {
120 TRACE_EVENT_END(internal::kJavaTraceCategory,
121 perfetto::Track(static_cast<uint64_t>(id)));
122 }
123
GetBackgroundStartupTracingFlag()124 bool GetBackgroundStartupTracingFlag() {
125 JNIEnv* env = jni_zero::AttachCurrentThread();
126 return base::android::Java_EarlyTraceEvent_getBackgroundStartupTracingFlag(
127 env);
128 }
129
SetBackgroundStartupTracingFlag(bool enabled)130 void SetBackgroundStartupTracingFlag(bool enabled) {
131 JNIEnv* env = jni_zero::AttachCurrentThread();
132 base::android::Java_EarlyTraceEvent_setBackgroundStartupTracingFlag(env,
133 enabled);
134 }
135
136 } // namespace android
137 } // namespace base
138