| // Copyright 2015 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 "sky/shell/android/tracing_controller.h" |
| |
| #include "base/android/jni_android.h" |
| #include "base/android/jni_string.h" |
| #include "base/files/file_util.h" |
| #include "base/macros.h" |
| #include "base/trace_event/trace_config.h" |
| #include "base/trace_event/trace_event.h" |
| #include "jni/TracingController_jni.h" |
| |
| namespace sky { |
| namespace shell { |
| namespace { |
| |
| const char kStart[] = "{\"traceEvents\":["; |
| const char kEnd[] = "]}"; |
| |
| static FILE* g_file = NULL; |
| |
| void Write(const std::string& data) { |
| ignore_result(fwrite(data.data(), data.length(), 1, g_file)); |
| } |
| |
| void HandleChunk(const scoped_refptr<base::RefCountedString>& chunk, |
| bool has_more_events) { |
| Write(chunk->data()); |
| if (has_more_events) |
| Write(","); |
| |
| if (!has_more_events) { |
| Write(kEnd); |
| base::CloseFile(g_file); |
| g_file = NULL; |
| |
| LOG(INFO) << "Trace complete"; |
| } |
| } |
| |
| } // namespace |
| |
| static void StartTracing(JNIEnv* env, jclass clazz) { |
| LOG(INFO) << "Starting trace"; |
| |
| base::trace_event::TraceLog::GetInstance()->SetEnabled( |
| base::trace_event::TraceConfig("*", base::trace_event::RECORD_UNTIL_FULL), |
| base::trace_event::TraceLog::RECORDING_MODE); |
| } |
| |
| static void StopTracing(JNIEnv* env, jclass clazz, jstring path) { |
| base::trace_event::TraceLog::GetInstance()->SetDisabled(); |
| |
| base::FilePath file_path(base::android::ConvertJavaStringToUTF8(env, path)); |
| g_file = base::OpenFile(file_path, "w"); |
| CHECK(g_file) << "Failed to open file " << file_path.LossyDisplayName(); |
| |
| LOG(INFO) << "Saving trace to " << file_path.LossyDisplayName(); |
| Write(kStart); |
| base::trace_event::TraceLog::GetInstance()->Flush(base::Bind(&HandleChunk)); |
| } |
| |
| bool RegisterTracingController(JNIEnv* env) { |
| return RegisterNativesImpl(env); |
| } |
| |
| } // namespace shell |
| } // namespace sky |