diff options
Diffstat (limited to 'content/browser/android/tracing_controller_android.cc')
-rw-r--r-- | content/browser/android/tracing_controller_android.cc | 67 |
1 files changed, 46 insertions, 21 deletions
diff --git a/content/browser/android/tracing_controller_android.cc b/content/browser/android/tracing_controller_android.cc index 75ac6d7..42d147e 100644 --- a/content/browser/android/tracing_controller_android.cc +++ b/content/browser/android/tracing_controller_android.cc @@ -6,9 +6,12 @@ #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/logging.h" -#include "content/public/browser/tracing_controller.h" +#include "content/browser/tracing/trace_subscriber_stdio.h" +#include "content/public/browser/trace_controller.h" #include "jni/TracingControllerAndroid_jni.h" namespace content { @@ -18,9 +21,29 @@ static jlong Init(JNIEnv* env, jobject obj) { 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_factory_(this) {} + : weak_java_object_(env, obj) {} TracingControllerAndroid::~TracingControllerAndroid() {} @@ -33,37 +56,39 @@ bool TracingControllerAndroid::StartTracing(JNIEnv* env, jstring jfilename, jstring jcategories, jboolean record_continuously) { - file_path_ = base::FilePath( - base::android::ConvertJavaStringToUTF8(env, jfilename)); + if (subscriber_.get()) { + return false; + } + std::string filename = base::android::ConvertJavaStringToUTF8(env, jfilename); std::string categories = base::android::ConvertJavaStringToUTF8(env, jcategories); - - // This log is required by adb_profile_chrome.py. - LOG(WARNING) << "Logging performance trace to file: " << file_path_.value(); - - return TracingController::GetInstance()->EnableRecording( + subscriber_.reset(new Subscriber(this, base::FilePath(filename))); + return TraceController::GetInstance()->BeginTracing( + subscriber_.get(), categories, - record_continuously ? TracingController::RECORD_CONTINUOUSLY - : TracingController::DEFAULT_OPTIONS, - TracingController::EnableRecordingDoneCallback()); + record_continuously ? base::debug::TraceLog::RECORD_CONTINUOUSLY + : base::debug::TraceLog::RECORD_UNTIL_FULL); } void TracingControllerAndroid::StopTracing(JNIEnv* env, jobject obj) { - if (!TracingController::GetInstance()->DisableRecording( - file_path_, - base::Bind(&TracingControllerAndroid::OnTracingStopped, - weak_factory_.GetWeakPtr()))) { + if (!subscriber_.get()) { + return; + } + TraceController* controller = TraceController::GetInstance(); + if (!controller->EndTracingAsync(subscriber_.get())) { LOG(ERROR) << "EndTracingAsync failed, forcing an immediate stop"; - OnTracingStopped(file_path_); + controller->CancelSubscriber(subscriber_.get()); + OnTracingStopped(); } } -void TracingControllerAndroid::OnTracingStopped( - const base::FilePath& file_path) { +void TracingControllerAndroid::OnTracingStopped() { 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()); + } + subscriber_.reset(); } static jstring GetDefaultCategories(JNIEnv* env, jobject obj) { |