Merge "Update handover rule java doc"
diff --git a/TRACE_OWNERS b/TRACE_OWNERS
new file mode 100644
index 0000000..f746a16
--- /dev/null
+++ b/TRACE_OWNERS
@@ -0,0 +1,5 @@
+# OWNERS of Trace-related files
+primiano@google.com
+timmurray@google.com
+jjaggi@google.com
+jreck@google.com
diff --git a/core/java/android/os/OWNERS b/core/java/android/os/OWNERS
index 8e5ed8f..1f3108a 100644
--- a/core/java/android/os/OWNERS
+++ b/core/java/android/os/OWNERS
@@ -66,3 +66,6 @@
 
 # VINTF
 per-file Vintf* = file:/platform/system/libvintf:/OWNERS
+
+# Tracing
+per-file Trace.java = file:/TRACE_OWNERS
diff --git a/core/java/android/os/Trace.java b/core/java/android/os/Trace.java
index 6b869f1..231c22b 100644
--- a/core/java/android/os/Trace.java
+++ b/core/java/android/os/Trace.java
@@ -136,6 +136,12 @@
     @FastNative
     private static native void nativeAsyncTraceEnd(long tag, String name, int cookie);
     @FastNative
+    private static native void nativeAsyncTraceForTrackBegin(long tag,
+            String trackName, String name, int cookie);
+    @FastNative
+    private static native void nativeAsyncTraceForTrackEnd(long tag,
+            String trackName, String name, int cookie);
+    @FastNative
     private static native void nativeInstant(long tag, String name);
     @FastNative
     private static native void nativeInstantForTrack(long tag, String trackName, String name);
@@ -271,6 +277,47 @@
         }
     }
 
+
+    /**
+     * Writes a trace message to indicate that a given section of code has
+     * begun. Must be followed by a call to {@link #asyncTraceForTrackEnd} using the same
+     * tag. This function operates exactly like {@link #asyncTraceBegin(long, String, int)},
+     * except with the inclusion of a track name argument for where this method should appear.
+     *
+     * @param traceTag The trace tag.
+     * @param trackName The track where the event should appear in the trace.
+     * @param methodName The method name to appear in the trace.
+     * @param cookie Unique identifier for distinguishing simultaneous events
+     *
+     * @hide
+     */
+    public static void asyncTraceForTrackBegin(long traceTag,
+            @NonNull String trackName, @NonNull String methodName, int cookie) {
+        if (isTagEnabled(traceTag)) {
+            nativeAsyncTraceForTrackBegin(traceTag, trackName, methodName, cookie);
+        }
+    }
+
+    /**
+     * Writes a trace message to indicate that the current method has ended.
+     * Must be called exactly once for each call to
+     * {@link #asyncTraceForTrackBegin(long, String, String, int)}
+     * using the same tag, track name, name and cookie.
+     *
+     * @param traceTag The trace tag.
+     * @param trackName The track where the event should appear in the trace.
+     * @param methodName The method name to appear in the trace.
+     * @param cookie Unique identifier for distinguishing simultaneous events
+     *
+     * @hide
+     */
+    public static void asyncTraceForTrackEnd(long traceTag,
+            @NonNull String trackName, @NonNull String methodName, int cookie) {
+        if (isTagEnabled(traceTag)) {
+            nativeAsyncTraceForTrackEnd(traceTag, trackName, methodName, cookie);
+        }
+    }
+
     /**
      * Writes a trace message to indicate that a given section of code was invoked.
      *
diff --git a/core/jni/OWNERS b/core/jni/OWNERS
index 8cac2e8c..626a212 100644
--- a/core/jni/OWNERS
+++ b/core/jni/OWNERS
@@ -56,6 +56,7 @@
 per-file android_media_midi_* = file:/media/java/android/media/midi/OWNERS
 per-file android_opengl_* = file:/opengl/java/android/opengl/OWNERS
 per-file android_os_storage_* = file:/core/java/android/os/storage/OWNERS
+per-file android_os_Trace* = file:/TRACE_OWNERS
 per-file android_se_* = file:/omapi/java/android/se/OWNERS
 per-file android_security_* = file:/core/java/android/security/OWNERS
 per-file android_view_* = file:/core/java/android/view/OWNERS
diff --git a/core/jni/android_os_Trace.cpp b/core/jni/android_os_Trace.cpp
index 85fd5d9..734b6ca 100644
--- a/core/jni/android_os_Trace.cpp
+++ b/core/jni/android_os_Trace.cpp
@@ -82,6 +82,26 @@
     });
 }
 
+static void android_os_Trace_nativeAsyncTraceForTrackBegin(JNIEnv* env, jclass, jlong tag,
+                                                           jstring trackStr, jstring nameStr,
+                                                           jint cookie) {
+    withString(env, trackStr, [env, tag, nameStr, cookie](char* track) {
+        withString(env, nameStr, [tag, track, cookie](char* name) {
+            atrace_async_for_track_begin(tag, track, name, cookie);
+        });
+    });
+}
+
+static void android_os_Trace_nativeAsyncTraceForTrackEnd(JNIEnv* env, jclass, jlong tag,
+                                                         jstring trackStr, jstring nameStr,
+                                                         jint cookie) {
+    withString(env, trackStr, [env, tag, nameStr, cookie](char* track) {
+        withString(env, nameStr, [tag, track, cookie](char* name) {
+            atrace_async_for_track_end(tag, track, name, cookie);
+        });
+    });
+}
+
 static void android_os_Trace_nativeSetAppTracingAllowed(JNIEnv*, jclass, jboolean allowed) {
     atrace_update_tags();
 }
@@ -132,6 +152,12 @@
     { "nativeAsyncTraceEnd",
             "(JLjava/lang/String;I)V",
             (void*)android_os_Trace_nativeAsyncTraceEnd },
+    { "nativeAsyncTraceForTrackBegin",
+            "(JLjava/lang/String;Ljava/lang/String;I)V",
+            (void*)android_os_Trace_nativeAsyncTraceForTrackBegin },
+    { "nativeAsyncTraceForTrackEnd",
+            "(JLjava/lang/String;Ljava/lang/String;I)V",
+            (void*)android_os_Trace_nativeAsyncTraceForTrackEnd },
     { "nativeInstant",
             "(JLjava/lang/String;)V",
             (void*)android_os_Trace_nativeInstant },