blob: 81428dc02fb47b99b21ca402a7c44e2078dae172 [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
John Reckd5a9dc02018-07-16 10:42:35 -070017#include <jni.h>
Dan Albert46d84442014-11-18 16:07:51 -080018
Mark Salyzyn52eb4e02016-09-28 16:15:30 -070019#include <cutils/trace.h>
Mark Salyzyn52eb4e02016-09-28 16:15:30 -070020#include <log/log.h>
Steven Moreland2279b252017-07-19 09:50:45 -070021#include <nativehelper/JNIHelp.h>
John Reckd5a9dc02018-07-16 10:42:35 -070022
23#include <array>
Jamie Gennisf9c7d6b2013-03-25 14:18:25 -070024
Jeff Brown481c1572012-03-09 14:41:15 -080025namespace android {
26
John Reckd5a9dc02018-07-16 10:42:35 -070027inline static void sanitizeString(char* str, size_t size) {
Romain Guy9425f922013-04-10 16:35:48 -070028 for (size_t i = 0; i < size; i++) {
29 char c = str[i];
30 if (c == '\0' || c == '\n' || c == '|') {
31 str[i] = ' ';
32 }
33 }
Romain Guy9425f922013-04-10 16:35:48 -070034}
35
John Reckd5a9dc02018-07-16 10:42:35 -070036inline static void getString(JNIEnv* env, jstring jstring, char* outBuffer, jsize maxSize) {
37 jsize size = std::min(env->GetStringLength(jstring), maxSize);
38 env->GetStringUTFRegion(jstring, 0, size, outBuffer);
39 sanitizeString(outBuffer, size);
40 outBuffer[size] = '\0';
41}
42
43template<typename F>
44inline static void withString(JNIEnv* env, jstring jstr, F callback) {
45 std::array<char, 1024> buffer;
46 getString(env, jstr, buffer.data(), buffer.size());
47 callback(buffer.data());
48}
49
50static jlong android_os_Trace_nativeGetEnabledTags(JNIEnv*, jclass) {
Alex Ray8a6787b2012-11-14 18:08:49 -080051 return atrace_get_enabled_tags();
Jeff Brown481c1572012-03-09 14:41:15 -080052}
53
John Reckd5a9dc02018-07-16 10:42:35 -070054static void android_os_Trace_nativeTraceCounter(JNIEnv* env, jclass,
John Reck77b31a52018-12-05 18:16:39 -080055 jlong tag, jstring nameStr, jlong value) {
John Reckd5a9dc02018-07-16 10:42:35 -070056 withString(env, nameStr, [tag, value](char* str) {
John Reck77b31a52018-12-05 18:16:39 -080057 atrace_int64(tag, str, value);
John Reckd5a9dc02018-07-16 10:42:35 -070058 });
Jeff Brown481c1572012-03-09 14:41:15 -080059}
60
John Reckd5a9dc02018-07-16 10:42:35 -070061static void android_os_Trace_nativeTraceBegin(JNIEnv* env, jclass,
Jeff Brown481c1572012-03-09 14:41:15 -080062 jlong tag, jstring nameStr) {
John Reckd5a9dc02018-07-16 10:42:35 -070063 withString(env, nameStr, [tag](char* str) {
64 atrace_begin(tag, str);
65 });
Jeff Brown481c1572012-03-09 14:41:15 -080066}
67
John Reckd5a9dc02018-07-16 10:42:35 -070068static void android_os_Trace_nativeTraceEnd(JNIEnv*, jclass, jlong tag) {
Alex Ray8a6787b2012-11-14 18:08:49 -080069 atrace_end(tag);
Jeff Brown481c1572012-03-09 14:41:15 -080070}
71
John Reckd5a9dc02018-07-16 10:42:35 -070072static void android_os_Trace_nativeAsyncTraceBegin(JNIEnv* env, jclass,
Romain Guy9425f922013-04-10 16:35:48 -070073 jlong tag, jstring nameStr, jint cookie) {
John Reckd5a9dc02018-07-16 10:42:35 -070074 withString(env, nameStr, [tag, cookie](char* str) {
75 atrace_async_begin(tag, str, cookie);
76 });
Romain Guy9425f922013-04-10 16:35:48 -070077}
78
John Reckd5a9dc02018-07-16 10:42:35 -070079static void android_os_Trace_nativeAsyncTraceEnd(JNIEnv* env, jclass,
Romain Guy9425f922013-04-10 16:35:48 -070080 jlong tag, jstring nameStr, jint cookie) {
John Reckd5a9dc02018-07-16 10:42:35 -070081 withString(env, nameStr, [tag, cookie](char* str) {
82 atrace_async_end(tag, str, cookie);
83 });
Romain Guy9425f922013-04-10 16:35:48 -070084}
85
John Reckd5a9dc02018-07-16 10:42:35 -070086static void android_os_Trace_nativeSetAppTracingAllowed(JNIEnv*, jclass, jboolean allowed) {
Jamie Gennisf9c7d6b2013-03-25 14:18:25 -070087 atrace_set_debuggable(allowed);
88}
89
John Reckd5a9dc02018-07-16 10:42:35 -070090static void android_os_Trace_nativeSetTracingEnabled(JNIEnv*, jclass, jboolean enabled) {
Jamie Gennis6ad04522013-04-15 18:53:24 -070091 atrace_set_tracing_enabled(enabled);
92}
93
Daniel Micay76f6a862015-09-19 17:31:01 -040094static const JNINativeMethod gTraceMethods[] = {
Jeff Brown481c1572012-03-09 14:41:15 -080095 /* name, signature, funcPtr */
96 { "nativeGetEnabledTags",
97 "()J",
98 (void*)android_os_Trace_nativeGetEnabledTags },
Jamie Gennisf9c7d6b2013-03-25 14:18:25 -070099 { "nativeSetAppTracingAllowed",
100 "(Z)V",
101 (void*)android_os_Trace_nativeSetAppTracingAllowed },
Jamie Gennis6ad04522013-04-15 18:53:24 -0700102 { "nativeSetTracingEnabled",
103 "(Z)V",
104 (void*)android_os_Trace_nativeSetTracingEnabled },
John Reck6be2cab2016-10-03 14:38:06 -0700105
106 // ----------- @FastNative ----------------
107
108 { "nativeTraceCounter",
John Reck77b31a52018-12-05 18:16:39 -0800109 "(JLjava/lang/String;J)V",
John Reck6be2cab2016-10-03 14:38:06 -0700110 (void*)android_os_Trace_nativeTraceCounter },
111 { "nativeTraceBegin",
112 "(JLjava/lang/String;)V",
113 (void*)android_os_Trace_nativeTraceBegin },
114 { "nativeTraceEnd",
115 "(J)V",
116 (void*)android_os_Trace_nativeTraceEnd },
117 { "nativeAsyncTraceBegin",
118 "(JLjava/lang/String;I)V",
119 (void*)android_os_Trace_nativeAsyncTraceBegin },
120 { "nativeAsyncTraceEnd",
121 "(JLjava/lang/String;I)V",
122 (void*)android_os_Trace_nativeAsyncTraceEnd },
Jeff Brown481c1572012-03-09 14:41:15 -0800123};
124
125int register_android_os_Trace(JNIEnv* env) {
126 int res = jniRegisterNativeMethods(env, "android/os/Trace",
127 gTraceMethods, NELEM(gTraceMethods));
Andreas Gampe987f79f2014-11-18 17:29:46 -0800128 LOG_ALWAYS_FATAL_IF(res < 0, "Unable to register native methods.");
Jeff Brown481c1572012-03-09 14:41:15 -0800129
130 return 0;
131}
132
133} // namespace android