Reviewers: Jay Civelli, klobag.chromium,
Description:
Support JellyBean MR2 style of systrace
JB MR2 systrace.py combined the steps of trace tags settings and
trace collection into one step, so we need to react to the change
of the change of trace tags settings to enable/disable atrace
in chrome.
The change also benefit pre-JB-MR2 systems that we don't need to
restart chrome after changing the trace tags settings in Developer
options. However, we still need "adb shell stop; adb shell start"
if we set the trace tags using pre-JB-MR2 systrace.py.
BUG=173954
Please review this at
https://codereview.chromium.org/12221047/
SVN Base:
https://chromium.googlesource.com/chromium/src.git@master
Affected files:
M base/debug/trace_event_android.cc
M base/debug/trace_event_impl.h
M content/common/android/trace_event_binding.cc
M
content/public/android/java/src/org/chromium/content/common/TraceEvent.java
Index: base/debug/trace_event_android.cc
diff --git a/base/debug/trace_event_android.cc
b/base/debug/trace_event_android.cc
index
29e684a659d6e17aa51f0087aae3860b16d4c206..2901a3427f22fdc815c0b5fa5c3d380a89c416ee
100644
--- a/base/debug/trace_event_android.cc
+++ b/base/debug/trace_event_android.cc
@@ -20,12 +20,21 @@ const char* kATraceMarkerFile
= "/sys/kernel/debug/tracing/trace_marker";
namespace base {
namespace debug {
-// static
-void TraceLog::InitATrace() {
- DCHECK(g_atrace_fd == -1);
- g_atrace_fd = open(kATraceMarkerFile, O_WRONLY | O_APPEND);
- if (g_atrace_fd == -1)
- LOG(WARNING) << "Couldn't open " << kATraceMarkerFile;
+void TraceLog::StartATrace() {
+ AutoLock lock(lock_);
+ if (g_atrace_fd == -1) {
+ g_atrace_fd = open(kATraceMarkerFile, O_WRONLY);
+ if (g_atrace_fd == -1)
+ LOG(WARNING) << "Couldn't open " << kATraceMarkerFile;
+ }
+}
+
+void TraceLog::StopATrace() {
+ AutoLock lock(lock_);
+ if (g_atrace_fd != -1) {
+ close(g_atrace_fd);
+ g_atrace_fd = -1;
+ }
}
void TraceLog::SendToATrace(char phase,
@@ -91,6 +100,8 @@ void TraceLog::SendToATrace(char phase,
void TraceLog::ApplyATraceEnabledFlag(unsigned char* category_enabled) {
if (g_atrace_fd != -1)
*category_enabled |= ATRACE_ENABLED;
+ else
+ *category_enabled &= ~ATRACE_ENABLED;
}
} // namespace debug
Index: base/debug/trace_event_impl.h
diff --git a/base/debug/trace_event_impl.h b/base/debug/trace_event_impl.h
index
58a44dabf0ef0c5665163bc27ab5436beb417c76..7e306e2a78f2532a1f4068242da1f7501e9eb4cd
100644
--- a/base/debug/trace_event_impl.h
+++ b/base/debug/trace_event_impl.h
@@ -209,7 +209,8 @@ class BASE_EXPORT TraceLog {
bool IsEnabled() { return !!enable_count_; }
#if defined(OS_ANDROID)
- static void InitATrace();
+ void StartATrace();
+ void StopATrace();
#endif
// Enabled state listeners give a callback when tracing is enabled or
Index: content/common/android/trace_event_binding.cc
diff --git a/content/common/android/trace_event_binding.cc
b/content/common/android/trace_event_binding.cc
index
6dd3847cdac99df42a37d1b7727c5dba88355f72..04607ed20318e648789da8e7b09e703e77f47803
100644
--- a/content/common/android/trace_event_binding.cc
+++ b/content/common/android/trace_event_binding.cc
@@ -76,8 +76,12 @@ static jboolean TraceEnabled(JNIEnv* env, jclass clazz) {
return base::debug::TraceLog::GetInstance()->IsEnabled();
}
-static void InitATrace(JNIEnv* env, jclass clazz) {
- base::debug::TraceLog::InitATrace();
+static void StartATrace(JNIEnv* env, jclass clazz) {
+ base::debug::TraceLog::GetInstance()->StartATrace();
+}
+
+static void StopATrace(JNIEnv* env, jclass clazz) {
+ base::debug::TraceLog::GetInstance()->StopATrace();
}
static void Instant(JNIEnv* env, jclass clazz,
Index:
content/public/android/java/src/org/chromium/content/common/TraceEvent.java
diff --git
a/content/public/android/java/src/org/chromium/content/common/TraceEvent.java
b/content/public/android/java/src/org/chromium/content/common/TraceEvent.java
index
67c5413093dbb453698e1106eb46b1f7f8fc97ee..835aa38e2c6d839ed5f4e897bd0db0190f51c6d6
100644
---
a/content/public/android/java/src/org/chromium/content/common/TraceEvent.java
+++
b/content/public/android/java/src/org/chromium/content/common/TraceEvent.java
@@ -37,6 +37,32 @@ public class TraceEvent {
}
}
+ static {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
+ try {
+ Class<?> systemPropertiesClass =
Class.forName("android.os.SystemProperties");
+ Method addChangeCallbackMethod =
systemPropertiesClass.getDeclaredMethod(
+ "addChangeCallback", Runnable.class);
+ addChangeCallbackMethod.invoke(null, new Runnable() {
+ @Override
+ public void run() {
+ setEnabledToMatchNative();
+ }
+ });
+ } catch (ClassNotFoundException e) {
+ Log.e("TraceEvent", "init", e);
+ } catch (NoSuchMethodException e) {
+ Log.e("TraceEvent", "init", e);
+ } catch (IllegalArgumentException e) {
+ Log.e("TraceEvent", "init", e);
+ } catch (IllegalAccessException e) {
+ Log.e("TraceEvent", "init", e);
+ } catch (InvocationTargetException e) {
+ Log.e("TraceEvent", "init", e);
+ }
+ }
+ }
+
/**
* Calling this will cause enabled() to be updated to match that set
on the native side.
* The native library must be loaded before calling this method.
@@ -47,11 +73,22 @@ public class TraceEvent {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
try {
Class<?> traceClass = Class.forName("android.os.Trace");
- Method m = traceClass.getDeclaredMethod("isTagEnabled",
Long.TYPE);
- Field f = traceClass.getField("TRACE_TAG_VIEW");
- boolean atraceEnabled = (Boolean) m.invoke(traceClass,
f.getLong(null));
- if (atraceEnabled) nativeInitATrace();
- enabled = enabled || atraceEnabled;
+ long traceTagView =
traceClass.getField("TRACE_TAG_VIEW").getLong(null);
+ String propertyTraceTagEnableFlags =
(String)traceClass.getField(
+ "PROPERTY_TRACE_TAG_ENABLEFLAGS").get(null);
+
+ Class<?> systemPropertiesClass =
Class.forName("android.os.SystemProperties");
+ Method systemPropertiesGetIntMethod =
systemPropertiesClass.getDeclaredMethod(
+ "getInt", String.class, Integer.TYPE);
+ int enabledTags = (Integer)
systemPropertiesGetIntMethod.invoke(
+ null, propertyTraceTagEnableFlags, 0);
+ Log.d("TraceEvent", "New enabled tags: " + enabledTags);
+ if ((enabledTags & traceTagView) != 0) {
+ nativeStartATrace();
+ enabled = true;
+ } else {
+ nativeStopATrace();
+ }
} catch (ClassNotFoundException e) {
Log.e("TraceEvent", "setEnabledToMatchNative", e);
} catch (NoSuchMethodException e) {
@@ -236,7 +273,8 @@ public class TraceEvent {
}
private static native boolean nativeTraceEnabled();
- private static native void nativeInitATrace();
+ private static native void nativeStartATrace();
+ private static native void nativeStopATrace();
private static native void nativeInstant(String name, String arg);
private static native void nativeBegin(String name, String arg);
private static native void nativeEnd(String name, String arg);