|  | // Copyright 2016 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "base/android/early_trace_event_binding.h" | 
|  |  | 
|  | #include "base/android/jni_string.h" | 
|  | #include "base/time/time.h" | 
|  | #include "base/trace_event/trace_event.h" | 
|  | #include "jni/EarlyTraceEvent_jni.h" | 
|  | #include "starboard/types.h" | 
|  |  | 
|  | namespace base { | 
|  | namespace android { | 
|  |  | 
|  | const char kEarlyJavaCategory[] = "EarlyJava"; | 
|  |  | 
|  | static void JNI_EarlyTraceEvent_RecordEarlyEvent( | 
|  | JNIEnv* env, | 
|  | const JavaParamRef<jclass>& clazz, | 
|  | const JavaParamRef<jstring>& jname, | 
|  | jlong begin_time_ns, | 
|  | jlong end_time_ns, | 
|  | jint thread_id, | 
|  | jlong thread_duration_ms) { | 
|  | std::string name = ConvertJavaStringToUTF8(env, jname); | 
|  | int64_t begin_us = begin_time_ns / 1000; | 
|  | int64_t end_us = end_time_ns / 1000; | 
|  | int64_t thread_duration_us = thread_duration_ms * 1000; | 
|  |  | 
|  | INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMPS( | 
|  | kEarlyJavaCategory, name.c_str(), trace_event_internal::kNoId, thread_id, | 
|  | TimeTicks::FromInternalValue(begin_us), | 
|  | TimeTicks::FromInternalValue(end_us), | 
|  | ThreadTicks::Now() + TimeDelta::FromMicroseconds(thread_duration_us), | 
|  | TRACE_EVENT_FLAG_COPY); | 
|  | } | 
|  |  | 
|  | static void JNI_EarlyTraceEvent_RecordEarlyStartAsyncEvent( | 
|  | JNIEnv* env, | 
|  | const JavaParamRef<jclass>& clazz, | 
|  | const JavaParamRef<jstring>& jname, | 
|  | jlong id, | 
|  | jlong timestamp_ns) { | 
|  | std::string name = ConvertJavaStringToUTF8(env, jname); | 
|  | int64_t timestamp_us = timestamp_ns / 1000; | 
|  |  | 
|  | TRACE_EVENT_COPY_ASYNC_BEGIN_WITH_TIMESTAMP0( | 
|  | kEarlyJavaCategory, name.c_str(), id, | 
|  | base::TimeTicks() + base::TimeDelta::FromMicroseconds(timestamp_us)); | 
|  | } | 
|  |  | 
|  | static void JNI_EarlyTraceEvent_RecordEarlyFinishAsyncEvent( | 
|  | JNIEnv* env, | 
|  | const JavaParamRef<jclass>& clazz, | 
|  | const JavaParamRef<jstring>& jname, | 
|  | jlong id, | 
|  | jlong timestamp_ns) { | 
|  | std::string name = ConvertJavaStringToUTF8(env, jname); | 
|  | int64_t timestamp_us = timestamp_ns / 1000; | 
|  |  | 
|  | TRACE_EVENT_COPY_ASYNC_END_WITH_TIMESTAMP0( | 
|  | kEarlyJavaCategory, name.c_str(), id, | 
|  | base::TimeTicks() + base::TimeDelta::FromMicroseconds(timestamp_us)); | 
|  | } | 
|  |  | 
|  | bool GetBackgroundStartupTracingFlag() { | 
|  | JNIEnv* env = base::android::AttachCurrentThread(); | 
|  | return base::android::Java_EarlyTraceEvent_getBackgroundStartupTracingFlag( | 
|  | env); | 
|  | } | 
|  |  | 
|  | void SetBackgroundStartupTracingFlag(bool enabled) { | 
|  | JNIEnv* env = base::android::AttachCurrentThread(); | 
|  | base::android::Java_EarlyTraceEvent_setBackgroundStartupTracingFlag(env, | 
|  | enabled); | 
|  | } | 
|  |  | 
|  | }  // namespace android | 
|  | }  // namespace base |