1*635a8641SAndroid Build Coastguard Worker // Copyright 2014 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker
5*635a8641SAndroid Build Coastguard Worker #include <jni.h>
6*635a8641SAndroid Build Coastguard Worker
7*635a8641SAndroid Build Coastguard Worker #include <set>
8*635a8641SAndroid Build Coastguard Worker
9*635a8641SAndroid Build Coastguard Worker #include "base/android/jni_string.h"
10*635a8641SAndroid Build Coastguard Worker #include "base/lazy_instance.h"
11*635a8641SAndroid Build Coastguard Worker #include "base/macros.h"
12*635a8641SAndroid Build Coastguard Worker #include "base/trace_event/trace_event.h"
13*635a8641SAndroid Build Coastguard Worker #include "base/trace_event/trace_event_impl.h"
14*635a8641SAndroid Build Coastguard Worker #include "jni/TraceEvent_jni.h"
15*635a8641SAndroid Build Coastguard Worker
16*635a8641SAndroid Build Coastguard Worker namespace base {
17*635a8641SAndroid Build Coastguard Worker namespace android {
18*635a8641SAndroid Build Coastguard Worker
19*635a8641SAndroid Build Coastguard Worker namespace {
20*635a8641SAndroid Build Coastguard Worker
21*635a8641SAndroid Build Coastguard Worker const char kJavaCategory[] = "Java";
22*635a8641SAndroid Build Coastguard Worker const char kToplevelCategory[] = "toplevel";
23*635a8641SAndroid Build Coastguard Worker const char kLooperDispatchMessage[] = "Looper.dispatchMessage";
24*635a8641SAndroid Build Coastguard Worker
25*635a8641SAndroid Build Coastguard Worker // Boilerplate for safely converting Java data to TRACE_EVENT data.
26*635a8641SAndroid Build Coastguard Worker class TraceEventDataConverter {
27*635a8641SAndroid Build Coastguard Worker public:
TraceEventDataConverter(JNIEnv * env,jstring jname,jstring jarg)28*635a8641SAndroid Build Coastguard Worker TraceEventDataConverter(JNIEnv* env, jstring jname, jstring jarg)
29*635a8641SAndroid Build Coastguard Worker : name_(ConvertJavaStringToUTF8(env, jname)),
30*635a8641SAndroid Build Coastguard Worker has_arg_(jarg != nullptr),
31*635a8641SAndroid Build Coastguard Worker arg_(jarg ? ConvertJavaStringToUTF8(env, jarg) : "") {}
~TraceEventDataConverter()32*635a8641SAndroid Build Coastguard Worker ~TraceEventDataConverter() {
33*635a8641SAndroid Build Coastguard Worker }
34*635a8641SAndroid Build Coastguard Worker
35*635a8641SAndroid Build Coastguard Worker // Return saves values to pass to TRACE_EVENT macros.
name()36*635a8641SAndroid Build Coastguard Worker const char* name() { return name_.c_str(); }
arg_name()37*635a8641SAndroid Build Coastguard Worker const char* arg_name() { return has_arg_ ? "arg" : nullptr; }
arg()38*635a8641SAndroid Build Coastguard Worker const char* arg() { return has_arg_ ? arg_.c_str() : nullptr; }
39*635a8641SAndroid Build Coastguard Worker
40*635a8641SAndroid Build Coastguard Worker private:
41*635a8641SAndroid Build Coastguard Worker std::string name_;
42*635a8641SAndroid Build Coastguard Worker bool has_arg_;
43*635a8641SAndroid Build Coastguard Worker std::string arg_;
44*635a8641SAndroid Build Coastguard Worker
45*635a8641SAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(TraceEventDataConverter);
46*635a8641SAndroid Build Coastguard Worker };
47*635a8641SAndroid Build Coastguard Worker
48*635a8641SAndroid Build Coastguard Worker class TraceEnabledObserver
49*635a8641SAndroid Build Coastguard Worker : public trace_event::TraceLog::EnabledStateObserver {
50*635a8641SAndroid Build Coastguard Worker public:
OnTraceLogEnabled()51*635a8641SAndroid Build Coastguard Worker void OnTraceLogEnabled() override {
52*635a8641SAndroid Build Coastguard Worker JNIEnv* env = base::android::AttachCurrentThread();
53*635a8641SAndroid Build Coastguard Worker base::android::Java_TraceEvent_setEnabled(env, true);
54*635a8641SAndroid Build Coastguard Worker }
OnTraceLogDisabled()55*635a8641SAndroid Build Coastguard Worker void OnTraceLogDisabled() override {
56*635a8641SAndroid Build Coastguard Worker JNIEnv* env = base::android::AttachCurrentThread();
57*635a8641SAndroid Build Coastguard Worker base::android::Java_TraceEvent_setEnabled(env, false);
58*635a8641SAndroid Build Coastguard Worker }
59*635a8641SAndroid Build Coastguard Worker };
60*635a8641SAndroid Build Coastguard Worker
61*635a8641SAndroid Build Coastguard Worker base::LazyInstance<TraceEnabledObserver>::Leaky g_trace_enabled_state_observer_;
62*635a8641SAndroid Build Coastguard Worker
63*635a8641SAndroid Build Coastguard Worker } // namespace
64*635a8641SAndroid Build Coastguard Worker
JNI_TraceEvent_RegisterEnabledObserver(JNIEnv * env,const JavaParamRef<jclass> & clazz)65*635a8641SAndroid Build Coastguard Worker static void JNI_TraceEvent_RegisterEnabledObserver(
66*635a8641SAndroid Build Coastguard Worker JNIEnv* env,
67*635a8641SAndroid Build Coastguard Worker const JavaParamRef<jclass>& clazz) {
68*635a8641SAndroid Build Coastguard Worker bool enabled = trace_event::TraceLog::GetInstance()->IsEnabled();
69*635a8641SAndroid Build Coastguard Worker base::android::Java_TraceEvent_setEnabled(env, enabled);
70*635a8641SAndroid Build Coastguard Worker trace_event::TraceLog::GetInstance()->AddEnabledStateObserver(
71*635a8641SAndroid Build Coastguard Worker g_trace_enabled_state_observer_.Pointer());
72*635a8641SAndroid Build Coastguard Worker }
73*635a8641SAndroid Build Coastguard Worker
JNI_TraceEvent_StartATrace(JNIEnv * env,const JavaParamRef<jclass> & clazz)74*635a8641SAndroid Build Coastguard Worker static void JNI_TraceEvent_StartATrace(JNIEnv* env,
75*635a8641SAndroid Build Coastguard Worker const JavaParamRef<jclass>& clazz) {
76*635a8641SAndroid Build Coastguard Worker base::trace_event::TraceLog::GetInstance()->StartATrace();
77*635a8641SAndroid Build Coastguard Worker }
78*635a8641SAndroid Build Coastguard Worker
JNI_TraceEvent_StopATrace(JNIEnv * env,const JavaParamRef<jclass> & clazz)79*635a8641SAndroid Build Coastguard Worker static void JNI_TraceEvent_StopATrace(JNIEnv* env,
80*635a8641SAndroid Build Coastguard Worker const JavaParamRef<jclass>& clazz) {
81*635a8641SAndroid Build Coastguard Worker base::trace_event::TraceLog::GetInstance()->StopATrace();
82*635a8641SAndroid Build Coastguard Worker }
83*635a8641SAndroid Build Coastguard Worker
JNI_TraceEvent_Instant(JNIEnv * env,const JavaParamRef<jclass> & clazz,const JavaParamRef<jstring> & jname,const JavaParamRef<jstring> & jarg)84*635a8641SAndroid Build Coastguard Worker static void JNI_TraceEvent_Instant(JNIEnv* env,
85*635a8641SAndroid Build Coastguard Worker const JavaParamRef<jclass>& clazz,
86*635a8641SAndroid Build Coastguard Worker const JavaParamRef<jstring>& jname,
87*635a8641SAndroid Build Coastguard Worker const JavaParamRef<jstring>& jarg) {
88*635a8641SAndroid Build Coastguard Worker TraceEventDataConverter converter(env, jname, jarg);
89*635a8641SAndroid Build Coastguard Worker if (converter.arg()) {
90*635a8641SAndroid Build Coastguard Worker TRACE_EVENT_COPY_INSTANT1(kJavaCategory, converter.name(),
91*635a8641SAndroid Build Coastguard Worker TRACE_EVENT_SCOPE_THREAD,
92*635a8641SAndroid Build Coastguard Worker converter.arg_name(), converter.arg());
93*635a8641SAndroid Build Coastguard Worker } else {
94*635a8641SAndroid Build Coastguard Worker TRACE_EVENT_COPY_INSTANT0(kJavaCategory, converter.name(),
95*635a8641SAndroid Build Coastguard Worker TRACE_EVENT_SCOPE_THREAD);
96*635a8641SAndroid Build Coastguard Worker }
97*635a8641SAndroid Build Coastguard Worker }
98*635a8641SAndroid Build Coastguard Worker
JNI_TraceEvent_Begin(JNIEnv * env,const JavaParamRef<jclass> & clazz,const JavaParamRef<jstring> & jname,const JavaParamRef<jstring> & jarg)99*635a8641SAndroid Build Coastguard Worker static void JNI_TraceEvent_Begin(JNIEnv* env,
100*635a8641SAndroid Build Coastguard Worker const JavaParamRef<jclass>& clazz,
101*635a8641SAndroid Build Coastguard Worker const JavaParamRef<jstring>& jname,
102*635a8641SAndroid Build Coastguard Worker const JavaParamRef<jstring>& jarg) {
103*635a8641SAndroid Build Coastguard Worker TraceEventDataConverter converter(env, jname, jarg);
104*635a8641SAndroid Build Coastguard Worker if (converter.arg()) {
105*635a8641SAndroid Build Coastguard Worker TRACE_EVENT_COPY_BEGIN1(kJavaCategory, converter.name(),
106*635a8641SAndroid Build Coastguard Worker converter.arg_name(), converter.arg());
107*635a8641SAndroid Build Coastguard Worker } else {
108*635a8641SAndroid Build Coastguard Worker TRACE_EVENT_COPY_BEGIN0(kJavaCategory, converter.name());
109*635a8641SAndroid Build Coastguard Worker }
110*635a8641SAndroid Build Coastguard Worker }
111*635a8641SAndroid Build Coastguard Worker
JNI_TraceEvent_End(JNIEnv * env,const JavaParamRef<jclass> & clazz,const JavaParamRef<jstring> & jname,const JavaParamRef<jstring> & jarg)112*635a8641SAndroid Build Coastguard Worker static void JNI_TraceEvent_End(JNIEnv* env,
113*635a8641SAndroid Build Coastguard Worker const JavaParamRef<jclass>& clazz,
114*635a8641SAndroid Build Coastguard Worker const JavaParamRef<jstring>& jname,
115*635a8641SAndroid Build Coastguard Worker const JavaParamRef<jstring>& jarg) {
116*635a8641SAndroid Build Coastguard Worker TraceEventDataConverter converter(env, jname, jarg);
117*635a8641SAndroid Build Coastguard Worker if (converter.arg()) {
118*635a8641SAndroid Build Coastguard Worker TRACE_EVENT_COPY_END1(kJavaCategory, converter.name(),
119*635a8641SAndroid Build Coastguard Worker converter.arg_name(), converter.arg());
120*635a8641SAndroid Build Coastguard Worker } else {
121*635a8641SAndroid Build Coastguard Worker TRACE_EVENT_COPY_END0(kJavaCategory, converter.name());
122*635a8641SAndroid Build Coastguard Worker }
123*635a8641SAndroid Build Coastguard Worker }
124*635a8641SAndroid Build Coastguard Worker
JNI_TraceEvent_BeginToplevel(JNIEnv * env,const JavaParamRef<jclass> & clazz,const JavaParamRef<jstring> & jtarget)125*635a8641SAndroid Build Coastguard Worker static void JNI_TraceEvent_BeginToplevel(JNIEnv* env,
126*635a8641SAndroid Build Coastguard Worker const JavaParamRef<jclass>& clazz,
127*635a8641SAndroid Build Coastguard Worker const JavaParamRef<jstring>& jtarget) {
128*635a8641SAndroid Build Coastguard Worker std::string target = ConvertJavaStringToUTF8(env, jtarget);
129*635a8641SAndroid Build Coastguard Worker TRACE_EVENT_BEGIN1(kToplevelCategory, kLooperDispatchMessage, "target",
130*635a8641SAndroid Build Coastguard Worker target);
131*635a8641SAndroid Build Coastguard Worker }
132*635a8641SAndroid Build Coastguard Worker
JNI_TraceEvent_EndToplevel(JNIEnv * env,const JavaParamRef<jclass> & clazz)133*635a8641SAndroid Build Coastguard Worker static void JNI_TraceEvent_EndToplevel(JNIEnv* env,
134*635a8641SAndroid Build Coastguard Worker const JavaParamRef<jclass>& clazz) {
135*635a8641SAndroid Build Coastguard Worker TRACE_EVENT_END0(kToplevelCategory, kLooperDispatchMessage);
136*635a8641SAndroid Build Coastguard Worker }
137*635a8641SAndroid Build Coastguard Worker
JNI_TraceEvent_StartAsync(JNIEnv * env,const JavaParamRef<jclass> & clazz,const JavaParamRef<jstring> & jname,jlong jid)138*635a8641SAndroid Build Coastguard Worker static void JNI_TraceEvent_StartAsync(JNIEnv* env,
139*635a8641SAndroid Build Coastguard Worker const JavaParamRef<jclass>& clazz,
140*635a8641SAndroid Build Coastguard Worker const JavaParamRef<jstring>& jname,
141*635a8641SAndroid Build Coastguard Worker jlong jid) {
142*635a8641SAndroid Build Coastguard Worker TraceEventDataConverter converter(env, jname, nullptr);
143*635a8641SAndroid Build Coastguard Worker TRACE_EVENT_COPY_ASYNC_BEGIN0(kJavaCategory, converter.name(), jid);
144*635a8641SAndroid Build Coastguard Worker }
145*635a8641SAndroid Build Coastguard Worker
JNI_TraceEvent_FinishAsync(JNIEnv * env,const JavaParamRef<jclass> & clazz,const JavaParamRef<jstring> & jname,jlong jid)146*635a8641SAndroid Build Coastguard Worker static void JNI_TraceEvent_FinishAsync(JNIEnv* env,
147*635a8641SAndroid Build Coastguard Worker const JavaParamRef<jclass>& clazz,
148*635a8641SAndroid Build Coastguard Worker const JavaParamRef<jstring>& jname,
149*635a8641SAndroid Build Coastguard Worker jlong jid) {
150*635a8641SAndroid Build Coastguard Worker TraceEventDataConverter converter(env, jname, nullptr);
151*635a8641SAndroid Build Coastguard Worker TRACE_EVENT_COPY_ASYNC_END0(kJavaCategory, converter.name(), jid);
152*635a8641SAndroid Build Coastguard Worker }
153*635a8641SAndroid Build Coastguard Worker
154*635a8641SAndroid Build Coastguard Worker } // namespace android
155*635a8641SAndroid Build Coastguard Worker } // namespace base
156