// 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/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_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& 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::CategoryFilter("*"), base::trace_event::TraceLog::RECORDING_MODE, base::trace_event::TraceOptions(base::trace_event::RECORD_UNTIL_FULL)); } 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