blob: 30fc47bba7510b033ab024ae00869ff53670f734 [file] [log] [blame]
Jeff Brown481c1572012-03-09 14:41:15 -08001/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "Trace"
Igor Murashkinc7282eb2013-10-17 18:19:48 -070018// #define LOG_NDEBUG 0
Jeff Brown481c1572012-03-09 14:41:15 -080019
Dan Albert46d84442014-11-18 16:07:51 -080020#include <inttypes.h>
21
Jeff Brown481c1572012-03-09 14:41:15 -080022#include <JNIHelp.h>
23#include <ScopedUtfChars.h>
Jamie Gennisf9c7d6b2013-03-25 14:18:25 -070024#include <ScopedStringChars.h>
25
26#include <utils/String8.h>
Jeff Brown481c1572012-03-09 14:41:15 -080027
Alex Ray8a6787b2012-11-14 18:08:49 -080028#include <cutils/trace.h>
Jeff Brown481c1572012-03-09 14:41:15 -080029#include <cutils/log.h>
30
31namespace android {
32
Romain Guy9425f922013-04-10 16:35:48 -070033static void sanitizeString(String8& utf8Chars) {
34 size_t size = utf8Chars.size();
35 char* str = utf8Chars.lockBuffer(size);
36 for (size_t i = 0; i < size; i++) {
37 char c = str[i];
38 if (c == '\0' || c == '\n' || c == '|') {
39 str[i] = ' ';
40 }
41 }
42 utf8Chars.unlockBuffer();
43}
44
Jeff Brown481c1572012-03-09 14:41:15 -080045static jlong android_os_Trace_nativeGetEnabledTags(JNIEnv* env, jclass clazz) {
Alex Ray8a6787b2012-11-14 18:08:49 -080046 return atrace_get_enabled_tags();
Jeff Brown481c1572012-03-09 14:41:15 -080047}
48
49static void android_os_Trace_nativeTraceCounter(JNIEnv* env, jclass clazz,
50 jlong tag, jstring nameStr, jint value) {
51 ScopedUtfChars name(env, nameStr);
Igor Murashkinc7282eb2013-10-17 18:19:48 -070052
Dan Albert46d84442014-11-18 16:07:51 -080053 ALOGV("%s: %" PRId64 " %s %d", __FUNCTION__, tag, name.c_str(), value);
Alex Ray8a6787b2012-11-14 18:08:49 -080054 atrace_int(tag, name.c_str(), value);
Jeff Brown481c1572012-03-09 14:41:15 -080055}
56
57static void android_os_Trace_nativeTraceBegin(JNIEnv* env, jclass clazz,
58 jlong tag, jstring nameStr) {
Jamie Gennisf9c7d6b2013-03-25 14:18:25 -070059 ScopedStringChars jchars(env, nameStr);
Romain Guy9425f922013-04-10 16:35:48 -070060 String8 utf8Chars(reinterpret_cast<const char16_t*>(jchars.get()), jchars.size());
61 sanitizeString(utf8Chars);
Igor Murashkinc7282eb2013-10-17 18:19:48 -070062
Dan Albert46d84442014-11-18 16:07:51 -080063 ALOGV("%s: %" PRId64 " %s", __FUNCTION__, tag, utf8Chars.string());
Jamie Gennisf9c7d6b2013-03-25 14:18:25 -070064 atrace_begin(tag, utf8Chars.string());
Jeff Brown481c1572012-03-09 14:41:15 -080065}
66
67static void android_os_Trace_nativeTraceEnd(JNIEnv* env, jclass clazz,
68 jlong tag) {
Igor Murashkinc7282eb2013-10-17 18:19:48 -070069
Dan Albert46d84442014-11-18 16:07:51 -080070 ALOGV("%s: %" PRId64, __FUNCTION__, tag);
Alex Ray8a6787b2012-11-14 18:08:49 -080071 atrace_end(tag);
Jeff Brown481c1572012-03-09 14:41:15 -080072}
73
Romain Guy9425f922013-04-10 16:35:48 -070074static void android_os_Trace_nativeAsyncTraceBegin(JNIEnv* env, jclass clazz,
75 jlong tag, jstring nameStr, jint cookie) {
Romain Guy9425f922013-04-10 16:35:48 -070076 ScopedStringChars jchars(env, nameStr);
77 String8 utf8Chars(reinterpret_cast<const char16_t*>(jchars.get()), jchars.size());
78 sanitizeString(utf8Chars);
Igor Murashkinc7282eb2013-10-17 18:19:48 -070079
Dan Albert46d84442014-11-18 16:07:51 -080080 ALOGV("%s: %" PRId64 " %s %d", __FUNCTION__, tag, utf8Chars.string(), cookie);
Romain Guy9425f922013-04-10 16:35:48 -070081 atrace_async_begin(tag, utf8Chars.string(), cookie);
82}
83
84static void android_os_Trace_nativeAsyncTraceEnd(JNIEnv* env, jclass clazz,
85 jlong tag, jstring nameStr, jint cookie) {
Romain Guy9425f922013-04-10 16:35:48 -070086 ScopedStringChars jchars(env, nameStr);
87 String8 utf8Chars(reinterpret_cast<const char16_t*>(jchars.get()), jchars.size());
88 sanitizeString(utf8Chars);
Igor Murashkinc7282eb2013-10-17 18:19:48 -070089
Dan Albert46d84442014-11-18 16:07:51 -080090 ALOGV("%s: %" PRId64 " %s %d", __FUNCTION__, tag, utf8Chars.string(), cookie);
Romain Guy9425f922013-04-10 16:35:48 -070091 atrace_async_end(tag, utf8Chars.string(), cookie);
92}
93
Jamie Gennisf9c7d6b2013-03-25 14:18:25 -070094static void android_os_Trace_nativeSetAppTracingAllowed(JNIEnv* env,
95 jclass clazz, jboolean allowed) {
Igor Murashkinc7282eb2013-10-17 18:19:48 -070096 ALOGV("%s: %d", __FUNCTION__, allowed);
97
Jamie Gennisf9c7d6b2013-03-25 14:18:25 -070098 atrace_set_debuggable(allowed);
99}
100
Jamie Gennis6ad04522013-04-15 18:53:24 -0700101static void android_os_Trace_nativeSetTracingEnabled(JNIEnv* env,
102 jclass clazz, jboolean enabled) {
Igor Murashkinc7282eb2013-10-17 18:19:48 -0700103 ALOGV("%s: %d", __FUNCTION__, enabled);
104
Jamie Gennis6ad04522013-04-15 18:53:24 -0700105 atrace_set_tracing_enabled(enabled);
106}
107
Daniel Micay76f6a862015-09-19 17:31:01 -0400108static const JNINativeMethod gTraceMethods[] = {
Jeff Brown481c1572012-03-09 14:41:15 -0800109 /* name, signature, funcPtr */
110 { "nativeGetEnabledTags",
111 "()J",
112 (void*)android_os_Trace_nativeGetEnabledTags },
113 { "nativeTraceCounter",
Chris Craika2235ee2015-06-03 13:46:11 -0700114 "!(JLjava/lang/String;I)V",
Jeff Brown481c1572012-03-09 14:41:15 -0800115 (void*)android_os_Trace_nativeTraceCounter },
116 { "nativeTraceBegin",
Chris Craika2235ee2015-06-03 13:46:11 -0700117 "!(JLjava/lang/String;)V",
Jeff Brown481c1572012-03-09 14:41:15 -0800118 (void*)android_os_Trace_nativeTraceBegin },
119 { "nativeTraceEnd",
Chris Craika2235ee2015-06-03 13:46:11 -0700120 "!(J)V",
Jeff Brown481c1572012-03-09 14:41:15 -0800121 (void*)android_os_Trace_nativeTraceEnd },
Romain Guy9425f922013-04-10 16:35:48 -0700122 { "nativeAsyncTraceBegin",
Chris Craika2235ee2015-06-03 13:46:11 -0700123 "!(JLjava/lang/String;I)V",
Romain Guy9425f922013-04-10 16:35:48 -0700124 (void*)android_os_Trace_nativeAsyncTraceBegin },
125 { "nativeAsyncTraceEnd",
Chris Craika2235ee2015-06-03 13:46:11 -0700126 "!(JLjava/lang/String;I)V",
Romain Guy9425f922013-04-10 16:35:48 -0700127 (void*)android_os_Trace_nativeAsyncTraceEnd },
Jamie Gennisf9c7d6b2013-03-25 14:18:25 -0700128 { "nativeSetAppTracingAllowed",
129 "(Z)V",
130 (void*)android_os_Trace_nativeSetAppTracingAllowed },
Jamie Gennis6ad04522013-04-15 18:53:24 -0700131 { "nativeSetTracingEnabled",
132 "(Z)V",
133 (void*)android_os_Trace_nativeSetTracingEnabled },
Jeff Brown481c1572012-03-09 14:41:15 -0800134};
135
136int register_android_os_Trace(JNIEnv* env) {
137 int res = jniRegisterNativeMethods(env, "android/os/Trace",
138 gTraceMethods, NELEM(gTraceMethods));
Andreas Gampe987f79f2014-11-18 17:29:46 -0800139 LOG_ALWAYS_FATAL_IF(res < 0, "Unable to register native methods.");
Jeff Brown481c1572012-03-09 14:41:15 -0800140
141 return 0;
142}
143
144} // namespace android