android_os_Trace.cpp revision f9c7d6bc15b68393c1f0aa85c3c023c31244c3f2
1fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek/*
2b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek * Copyright (C) 2012 The Android Open Source Project
3b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek *
4b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek * Licensed under the Apache License, Version 2.0 (the "License");
5b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek * you may not use this file except in compliance with the License.
6b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek * You may obtain a copy of the License at
7b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek *
8b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek *      http://www.apache.org/licenses/LICENSE-2.0
9b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek *
10fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek * Unless required by applicable law or agreed to in writing, software
11fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek * distributed under the License is distributed on an "AS IS" BASIS,
12b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek * See the License for the specific language governing permissions and
14b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek * limitations under the License.
15fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek */
16fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek
17b315a3940f804cf9fc67f4e3314aac6a44d623eeTed Kremenek#define LOG_TAG "Trace"
18991c54b9b7409656e5593364e065878b5210d556Ted Kremenek
19991c54b9b7409656e5593364e065878b5210d556Ted Kremenek#include <JNIHelp.h>
20ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenek#include <ScopedUtfChars.h>
211df35e310d3402879857dd78f6fa9aaeb94b35c4Ted Kremenek#include <ScopedStringChars.h>
222ec5cd553542ec54652fb2ae2395e46795b1af84Ted Kremenek
232ec5cd553542ec54652fb2ae2395e46795b1af84Ted Kremenek#include <utils/String8.h>
242ec5cd553542ec54652fb2ae2395e46795b1af84Ted Kremenek
25e600bedcfea91622a0003fdb5f66c500b2f9f17dTed Kremenek#include <cutils/trace.h>
26e600bedcfea91622a0003fdb5f66c500b2f9f17dTed Kremenek#include <cutils/log.h>
27e600bedcfea91622a0003fdb5f66c500b2f9f17dTed Kremenek
28e600bedcfea91622a0003fdb5f66c500b2f9f17dTed Kremeneknamespace android {
29ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenek
30ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenekstatic jlong android_os_Trace_nativeGetEnabledTags(JNIEnv* env, jclass clazz) {
31ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenek    return atrace_get_enabled_tags();
32ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenek}
33ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenek
34ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenekstatic void android_os_Trace_nativeTraceCounter(JNIEnv* env, jclass clazz,
35ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenek        jlong tag, jstring nameStr, jint value) {
36ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenek    ScopedUtfChars name(env, nameStr);
37ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenek    atrace_int(tag, name.c_str(), value);
38ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenek}
39991c54b9b7409656e5593364e065878b5210d556Ted Kremenek
40991c54b9b7409656e5593364e065878b5210d556Ted Kremenekstatic void android_os_Trace_nativeTraceBegin(JNIEnv* env, jclass clazz,
41991c54b9b7409656e5593364e065878b5210d556Ted Kremenek        jlong tag, jstring nameStr) {
42991c54b9b7409656e5593364e065878b5210d556Ted Kremenek    const size_t MAX_SECTION_NAME_LEN = 127;
43991c54b9b7409656e5593364e065878b5210d556Ted Kremenek    ScopedStringChars jchars(env, nameStr);
44991c54b9b7409656e5593364e065878b5210d556Ted Kremenek    String8 utf8Chars(reinterpret_cast<const char16_t*>(jchars.get()),
45991c54b9b7409656e5593364e065878b5210d556Ted Kremenek            jchars.size());
46991c54b9b7409656e5593364e065878b5210d556Ted Kremenek    size_t size = utf8Chars.size();
47991c54b9b7409656e5593364e065878b5210d556Ted Kremenek    char* str = utf8Chars.lockBuffer(size);
48991c54b9b7409656e5593364e065878b5210d556Ted Kremenek    for (size_t i = 0; i < size; i++) {
49a4d8cde6584aa6c1aee241faf671eb4bac93defbTed Kremenek        char c = str[i];
50a4d8cde6584aa6c1aee241faf671eb4bac93defbTed Kremenek        if (c == '\0' || c == '\n' || c == '|') {
515daa3be1bf9db399aa7510bbcf2bfc8c7701b6daTed Kremenek            str[i] = ' ';
52a4d8cde6584aa6c1aee241faf671eb4bac93defbTed Kremenek        }
53938eef139ad43345248235da31f78a759dd18f13Ted Kremenek    }
545daa3be1bf9db399aa7510bbcf2bfc8c7701b6daTed Kremenek    utf8Chars.unlockBuffer();
555d31f83bbe990aeb070ce6c8d919d229d4eb5052Ted Kremenek    atrace_begin(tag, utf8Chars.string());
56fd9df0eddd7d2b190f740f33a3d08f611c0be3f0Ted Kremenek}
57938eef139ad43345248235da31f78a759dd18f13Ted Kremenek
58991c54b9b7409656e5593364e065878b5210d556Ted Kremenekstatic void android_os_Trace_nativeTraceEnd(JNIEnv* env, jclass clazz,
595daa3be1bf9db399aa7510bbcf2bfc8c7701b6daTed Kremenek        jlong tag) {
605daa3be1bf9db399aa7510bbcf2bfc8c7701b6daTed Kremenek    atrace_end(tag);
61938eef139ad43345248235da31f78a759dd18f13Ted Kremenek}
62938eef139ad43345248235da31f78a759dd18f13Ted Kremenek
63938eef139ad43345248235da31f78a759dd18f13Ted Kremenekstatic void android_os_Trace_nativeSetAppTracingAllowed(JNIEnv* env,
64938eef139ad43345248235da31f78a759dd18f13Ted Kremenek        jclass clazz, jboolean allowed) {
65938eef139ad43345248235da31f78a759dd18f13Ted Kremenek    atrace_set_debuggable(allowed);
66938eef139ad43345248235da31f78a759dd18f13Ted Kremenek}
67c3998fa64e254b13669e8cf3a0cf23eb4f73b88bTed Kremenek
683386c8a510abc6f55ce25ef5e22c72e5d0c47a70Ted Kremenekstatic JNINativeMethod gTraceMethods[] = {
695daa3be1bf9db399aa7510bbcf2bfc8c7701b6daTed Kremenek    /* name, signature, funcPtr */
705daa3be1bf9db399aa7510bbcf2bfc8c7701b6daTed Kremenek    { "nativeGetEnabledTags",
715daa3be1bf9db399aa7510bbcf2bfc8c7701b6daTed Kremenek            "()J",
723386c8a510abc6f55ce25ef5e22c72e5d0c47a70Ted Kremenek            (void*)android_os_Trace_nativeGetEnabledTags },
73991c54b9b7409656e5593364e065878b5210d556Ted Kremenek    { "nativeTraceCounter",
74c3998fa64e254b13669e8cf3a0cf23eb4f73b88bTed Kremenek            "(JLjava/lang/String;I)V",
75c3998fa64e254b13669e8cf3a0cf23eb4f73b88bTed Kremenek            (void*)android_os_Trace_nativeTraceCounter },
7682a1253077cd0832e4d347062b911cd305ab62d1Ted Kremenek    { "nativeTraceBegin",
775f2825f6fa24a792c11cf96accd76538a2fd951eTed Kremenek            "(JLjava/lang/String;)V",
785d31f83bbe990aeb070ce6c8d919d229d4eb5052Ted Kremenek            (void*)android_os_Trace_nativeTraceBegin },
792dd7ad13bbbd43cb940040725a30cb7789bd2774Ted Kremenek    { "nativeTraceEnd",
80991c54b9b7409656e5593364e065878b5210d556Ted Kremenek            "(J)V",
8182a1253077cd0832e4d347062b911cd305ab62d1Ted Kremenek            (void*)android_os_Trace_nativeTraceEnd },
8282a1253077cd0832e4d347062b911cd305ab62d1Ted Kremenek    { "nativeSetAppTracingAllowed",
839f9b1fded49acff77e61b3ed1afc8bbaaefe6f34Ted Kremenek            "(Z)V",
84938eef139ad43345248235da31f78a759dd18f13Ted Kremenek            (void*)android_os_Trace_nativeSetAppTracingAllowed },
85991c54b9b7409656e5593364e065878b5210d556Ted Kremenek};
86b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek
87fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenekint register_android_os_Trace(JNIEnv* env) {
88fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek    int res = jniRegisterNativeMethods(env, "android/os/Trace",
89fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek            gTraceMethods, NELEM(gTraceMethods));
90b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek    LOG_FATAL_IF(res < 0, "Unable to register native methods.");
91fd9df0eddd7d2b190f740f33a3d08f611c0be3f0Ted Kremenek
92fd9df0eddd7d2b190f740f33a3d08f611c0be3f0Ted Kremenek    return 0;
93fd9df0eddd7d2b190f740f33a3d08f611c0be3f0Ted Kremenek}
94fd9df0eddd7d2b190f740f33a3d08f611c0be3f0Ted Kremenek
95fd9df0eddd7d2b190f740f33a3d08f611c0be3f0Ted Kremenek} // namespace android
96fd9df0eddd7d2b190f740f33a3d08f611c0be3f0Ted Kremenek