#include "base/android/jni_android.h"
#include "base/android/jni_string.h"
-#include "base/command_line.h"
#include "base/debug/trace_event.h"
-#include "base/files/file_path.h"
+#include "base/json/json_writer.h"
#include "base/logging.h"
-#include "content/browser/tracing/trace_subscriber_stdio.h"
-#include "content/public/browser/trace_controller.h"
+#include "content/public/browser/tracing_controller.h"
#include "jni/TracingControllerAndroid_jni.h"
namespace content {
-static jint Init(JNIEnv* env, jobject obj) {
+static jlong Init(JNIEnv* env, jobject obj) {
TracingControllerAndroid* profiler = new TracingControllerAndroid(env, obj);
- return reinterpret_cast<jint>(profiler);
+ return reinterpret_cast<intptr_t>(profiler);
}
-class TracingControllerAndroid::Subscriber
- : public content::TraceSubscriberStdio {
- public:
- Subscriber(TracingControllerAndroid* profiler, const base::FilePath& path)
- : TraceSubscriberStdio(path, FILE_TYPE_ARRAY, false),
- profiler_(profiler) {}
-
- void set_profiler(TracingControllerAndroid* profiler) {
- CHECK(!profiler_);
- profiler_ = profiler;
- }
-
- virtual void OnEndTracingComplete() OVERRIDE {
- TraceSubscriberStdio::OnEndTracingComplete();
- profiler_->OnTracingStopped();
- }
-
- private:
- TracingControllerAndroid* profiler_;
-};
-
TracingControllerAndroid::TracingControllerAndroid(JNIEnv* env, jobject obj)
- : weak_java_object_(env, obj) {}
+ : weak_java_object_(env, obj),
+ weak_factory_(this) {}
TracingControllerAndroid::~TracingControllerAndroid() {}
bool TracingControllerAndroid::StartTracing(JNIEnv* env,
jobject obj,
- jstring jfilename,
jstring jcategories,
- jboolean record_continuously) {
- if (subscriber_.get()) {
- return false;
- }
- std::string filename = base::android::ConvertJavaStringToUTF8(env, jfilename);
+ jstring jtraceoptions) {
std::string categories =
base::android::ConvertJavaStringToUTF8(env, jcategories);
- subscriber_.reset(new Subscriber(this, base::FilePath(filename)));
- return TraceController::GetInstance()->BeginTracing(
- subscriber_.get(),
- categories,
- record_continuously ? base::debug::TraceLog::RECORD_CONTINUOUSLY
- : base::debug::TraceLog::RECORD_UNTIL_FULL);
+ base::debug::TraceOptions trace_options;
+ trace_options.SetFromString(
+ base::android::ConvertJavaStringToUTF8(env, jtraceoptions));
+
+ // This log is required by adb_profile_chrome.py.
+ LOG(WARNING) << "Logging performance trace to file";
+
+ return TracingController::GetInstance()->EnableRecording(
+ base::debug::CategoryFilter(categories),
+ trace_options,
+ TracingController::EnableRecordingDoneCallback());
}
-void TracingControllerAndroid::StopTracing(JNIEnv* env, jobject obj) {
- if (!subscriber_.get()) {
- return;
- }
- TraceController* controller = TraceController::GetInstance();
- if (!controller->EndTracingAsync(subscriber_.get())) {
+void TracingControllerAndroid::StopTracing(JNIEnv* env,
+ jobject obj,
+ jstring jfilepath) {
+ base::FilePath file_path(
+ base::android::ConvertJavaStringToUTF8(env, jfilepath));
+ if (!TracingController::GetInstance()->DisableRecording(
+ file_path,
+ base::Bind(&TracingControllerAndroid::OnTracingStopped,
+ weak_factory_.GetWeakPtr()))) {
LOG(ERROR) << "EndTracingAsync failed, forcing an immediate stop";
- controller->CancelSubscriber(subscriber_.get());
- OnTracingStopped();
+ OnTracingStopped(file_path);
}
}
-void TracingControllerAndroid::OnTracingStopped() {
+void TracingControllerAndroid::GenerateTracingFilePath(
+ base::FilePath* file_path) {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ ScopedJavaLocalRef<jstring> jfilename =
+ Java_TracingControllerAndroid_generateTracingFilePath(env);
+ *file_path = base::FilePath(
+ base::android::ConvertJavaStringToUTF8(env, jfilename.obj()));
+}
+
+void TracingControllerAndroid::OnTracingStopped(
+ const base::FilePath& file_path) {
JNIEnv* env = base::android::AttachCurrentThread();
base::android::ScopedJavaLocalRef<jobject> obj = weak_java_object_.get(env);
- if (obj.obj()) {
+ if (obj.obj())
Java_TracingControllerAndroid_onTracingStopped(env, obj.obj());
+}
+
+bool TracingControllerAndroid::GetKnownCategoryGroupsAsync(JNIEnv* env,
+ jobject obj) {
+ if (!TracingController::GetInstance()->GetCategories(
+ base::Bind(&TracingControllerAndroid::OnKnownCategoriesReceived,
+ weak_factory_.GetWeakPtr()))) {
+ return false;
}
- subscriber_.reset();
+ return true;
+}
+
+void TracingControllerAndroid::OnKnownCategoriesReceived(
+ const std::set<std::string>& categories_received) {
+ scoped_ptr<base::ListValue> category_list(new base::ListValue());
+ for (std::set<std::string>::const_iterator it = categories_received.begin();
+ it != categories_received.end();
+ ++it) {
+ category_list->AppendString(*it);
+ }
+ std::string received_category_list;
+ base::JSONWriter::Write(category_list.get(), &received_category_list);
+
+ // This log is required by adb_profile_chrome.py.
+ LOG(WARNING) << "{\"traceCategoriesList\": " << received_category_list << "}";
}
static jstring GetDefaultCategories(JNIEnv* env, jobject obj) {