• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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