Merge "perfetto-ui: Make annotation slice selectable"
diff --git a/Android.bp b/Android.bp
index d3b7f3f..4ef5602 100644
--- a/Android.bp
+++ b/Android.bp
@@ -34,6 +34,7 @@
     "src/trace_processor/metrics/android/android_task_names.sql",
     "src/trace_processor/metrics/android/android_task_state.sql",
     "src/trace_processor/metrics/android/android_thread_time_in_state.sql",
+    "src/trace_processor/metrics/android/counter_span_view.sql",
     "src/trace_processor/metrics/android/cpu_info.sql",
     "src/trace_processor/metrics/android/display_metrics.sql",
     "src/trace_processor/metrics/android/heap_profile_callsites.sql",
@@ -41,6 +42,7 @@
     "src/trace_processor/metrics/android/java_heap_histogram.sql",
     "src/trace_processor/metrics/android/java_heap_stats.sql",
     "src/trace_processor/metrics/android/mem_stats_priority_breakdown.sql",
+    "src/trace_processor/metrics/android/process_counter_span_view.sql",
     "src/trace_processor/metrics/android/process_mem.sql",
     "src/trace_processor/metrics/android/process_metadata.sql",
     "src/trace_processor/metrics/android/process_oom_score.sql",
@@ -48,7 +50,6 @@
     "src/trace_processor/metrics/android/span_view_stats.sql",
     "src/trace_processor/metrics/android/unmapped_java_symbols.sql",
     "src/trace_processor/metrics/android/unsymbolized_frames.sql",
-    "src/trace_processor/metrics/android/upid_span_view.sql",
     "src/trace_processor/metrics/chrome/chrome_processes.sql",
     "src/trace_processor/metrics/trace_metadata.sql",
   ],
diff --git a/BUILD b/BUILD
index e32422d..9b74aff 100644
--- a/BUILD
+++ b/BUILD
@@ -755,6 +755,7 @@
         "src/trace_processor/metrics/android/android_task_names.sql",
         "src/trace_processor/metrics/android/android_task_state.sql",
         "src/trace_processor/metrics/android/android_thread_time_in_state.sql",
+        "src/trace_processor/metrics/android/counter_span_view.sql",
         "src/trace_processor/metrics/android/cpu_info.sql",
         "src/trace_processor/metrics/android/display_metrics.sql",
         "src/trace_processor/metrics/android/heap_profile_callsites.sql",
@@ -762,6 +763,7 @@
         "src/trace_processor/metrics/android/java_heap_histogram.sql",
         "src/trace_processor/metrics/android/java_heap_stats.sql",
         "src/trace_processor/metrics/android/mem_stats_priority_breakdown.sql",
+        "src/trace_processor/metrics/android/process_counter_span_view.sql",
         "src/trace_processor/metrics/android/process_mem.sql",
         "src/trace_processor/metrics/android/process_metadata.sql",
         "src/trace_processor/metrics/android/process_oom_score.sql",
@@ -769,7 +771,6 @@
         "src/trace_processor/metrics/android/span_view_stats.sql",
         "src/trace_processor/metrics/android/unmapped_java_symbols.sql",
         "src/trace_processor/metrics/android/unsymbolized_frames.sql",
-        "src/trace_processor/metrics/android/upid_span_view.sql",
         "src/trace_processor/metrics/chrome/chrome_processes.sql",
         "src/trace_processor/metrics/trace_metadata.sql",
     ],
diff --git a/OWNERS b/OWNERS
index 3e319bc..b61ef9c 100644
--- a/OWNERS
+++ b/OWNERS
@@ -13,6 +13,7 @@
 nuskos@google.com
 khokhlov@google.com
 ssid@google.com
+ddrone@google.com
 
 # chromium.org aliases for DEPS on third_party/perfetto.
 eseckler@chromium.org
diff --git a/bazel/proto_gen.bzl b/bazel/proto_gen.bzl
index 14e7e75..50f5747 100644
--- a/bazel/proto_gen.bzl
+++ b/bazel/proto_gen.bzl
@@ -82,14 +82,17 @@
         executable = ctx.executable.protoc,
         arguments = arguments,
     )
+    cc_files = depset([f for f in out_files if f.path.endswith(".cc")])
+    h_files = depset([f for f in out_files if f.path.endswith(".h")])
     return [
-        DefaultInfo(files = depset(out_files)),
+        DefaultInfo(files = cc_files),
         OutputGroupInfo(
-            cc = depset([f for f in out_files if f.path.endswith(".cc")]),
-            h = depset([f for f in out_files if f.path.endswith(".h")]),
+            cc = cc_files,
+            h = h_files,
         ),
     ]
 
+
 proto_gen = rule(
     attrs = {
         "deps": attr.label_list(
diff --git a/bazel/rules.bzl b/bazel/rules.bzl
index 65ff4b0..af272f5 100644
--- a/bazel/rules.bzl
+++ b/bazel/rules.bzl
@@ -197,10 +197,13 @@
         output_group = "h",
     )
 
+    # The headers from the gen plugin have implicit dependencies
+    # on each other so will fail when compiled independently. Use
+    # textual_hdrs to indicate this to Bazel.
     perfetto_cc_library(
         name = name,
         srcs = [":" + name + "_gen"],
-        hdrs = [":" + name + "_gen_h"],
+        textual_hdrs = [":" + name + "_gen_h"],
         deps = [
             PERFETTO_CONFIG.root + ":libprotozero"
         ] + _cc_deps,
diff --git a/include/perfetto/tracing/internal/track_event_data_source.h b/include/perfetto/tracing/internal/track_event_data_source.h
index f737054..e63f114 100644
--- a/include/perfetto/tracing/internal/track_event_data_source.h
+++ b/include/perfetto/tracing/internal/track_event_data_source.h
@@ -150,6 +150,7 @@
   // - Two debug annotations
   // - Track
   // - Track + Lambda
+  // - Track + timestamp
   // - Track + Lambda + timestamp
   // - Track + one debug annotation
   // - Track + two debug annotations
@@ -238,6 +239,22 @@
         TrackEventInternal::GetTimeNs(), std::move(arg_function));
   }
 
+  // Trace point with a track and overridden timestamp.
+  template <size_t CategoryIndex,
+            typename CategoryType,
+            typename TrackType,
+            typename TrackTypeCheck = typename std::enable_if<
+                std::is_convertible<TrackType, Track>::value>::type>
+  static void TraceForCategory(uint32_t instances,
+                               const CategoryType& dynamic_category,
+                               const char* event_name,
+                               perfetto::protos::pbzero::TrackEvent::Type type,
+                               const TrackType& track,
+                               uint64_t timestamp) PERFETTO_NO_INLINE {
+    TraceForCategoryImpl<CategoryIndex>(instances, dynamic_category, event_name,
+                                        type, track, timestamp);
+  }
+
   // Trace point with a track, a lambda function and an overridden timestamp.
   // |timestamp| must be in nanoseconds in the trace clock timebase.
   template <size_t CategoryIndex,
diff --git a/src/trace_processor/metrics/BUILD.gn b/src/trace_processor/metrics/BUILD.gn
index 01649da..28a121e 100644
--- a/src/trace_processor/metrics/BUILD.gn
+++ b/src/trace_processor/metrics/BUILD.gn
@@ -45,7 +45,8 @@
   "android/process_oom_score.sql",
   "android/mem_stats_priority_breakdown.sql",
   "android/span_view_stats.sql",
-  "android/upid_span_view.sql",
+  "android/process_counter_span_view.sql",
+  "android/counter_span_view.sql",
   "android/unmapped_java_symbols.sql",
   "android/unsymbolized_frames.sql",
   "chrome/chrome_processes.sql",
diff --git a/src/trace_processor/metrics/android/android_batt.sql b/src/trace_processor/metrics/android/android_batt.sql
index 94c92a6..e44bec3 100644
--- a/src/trace_processor/metrics/android/android_batt.sql
+++ b/src/trace_processor/metrics/android/android_batt.sql
@@ -52,7 +52,7 @@
 ) USING(ts)
 ORDER BY ts;
 
-SELECT RUN_METRIC('android/upid_span_view.sql',
+SELECT RUN_METRIC('android/counter_span_view.sql',
   'table_name', 'screen_state',
   'counter_name', 'ScreenState');
 
diff --git a/src/trace_processor/metrics/android/counter_span_view.sql b/src/trace_processor/metrics/android/counter_span_view.sql
new file mode 100644
index 0000000..cdd953a
--- /dev/null
+++ b/src/trace_processor/metrics/android/counter_span_view.sql
@@ -0,0 +1,25 @@
+--
+-- Copyright 2020 The Android Open Source Project
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+--     https://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+
+CREATE VIEW IF NOT EXISTS {{table_name}}_span AS
+SELECT
+  ts,
+  LEAD(ts, 1, (SELECT end_ts + 1 FROM trace_bounds))
+      OVER(PARTITION BY track_id ORDER BY ts) - ts AS dur,
+  value AS {{table_name}}_val
+FROM counter c JOIN counter_track t
+  ON t.id = c.track_id
+WHERE name = '{{counter_name}}';
diff --git a/src/trace_processor/metrics/android/upid_span_view.sql b/src/trace_processor/metrics/android/process_counter_span_view.sql
similarity index 92%
rename from src/trace_processor/metrics/android/upid_span_view.sql
rename to src/trace_processor/metrics/android/process_counter_span_view.sql
index 471e71e..2853f62 100644
--- a/src/trace_processor/metrics/android/upid_span_view.sql
+++ b/src/trace_processor/metrics/android/process_counter_span_view.sql
@@ -14,9 +14,7 @@
 -- limitations under the License.
 --
 
-DROP VIEW IF EXISTS {{table_name}}_span;
-
-CREATE VIEW {{table_name}}_span AS
+CREATE VIEW IF NOT EXISTS {{table_name}}_span AS
 SELECT
   ts,
   LEAD(ts, 1, (
diff --git a/src/trace_processor/metrics/android/process_mem.sql b/src/trace_processor/metrics/android/process_mem.sql
index fa07a9d..a51a78a 100644
--- a/src/trace_processor/metrics/android/process_mem.sql
+++ b/src/trace_processor/metrics/android/process_mem.sql
@@ -16,21 +16,21 @@
 
 -- Create all the views used to generate the Android Memory metrics proto.
 -- Anon RSS
-SELECT RUN_METRIC('android/upid_span_view.sql',
+SELECT RUN_METRIC('android/process_counter_span_view.sql',
   'table_name', 'anon_rss',
   'counter_name', 'mem.rss.anon');
 
 -- File RSS
-SELECT RUN_METRIC('android/upid_span_view.sql',
+SELECT RUN_METRIC('android/process_counter_span_view.sql',
   'table_name', 'file_rss',
   'counter_name', 'mem.rss.file');
 
-SELECT RUN_METRIC('android/upid_span_view.sql',
+SELECT RUN_METRIC('android/process_counter_span_view.sql',
   'table_name', 'shmem_rss',
   'counter_name', 'mem.rss.shmem');
 
 -- Swap
-SELECT RUN_METRIC('android/upid_span_view.sql',
+SELECT RUN_METRIC('android/process_counter_span_view.sql',
   'table_name', 'swap',
   'counter_name', 'mem.swap');
 
@@ -80,7 +80,7 @@
 FROM rss_and_swap_join;
 
 -- If we have dalvik events enabled (for ART trace points) we can construct the java heap timeline.
-SELECT RUN_METRIC('android/upid_span_view.sql',
+SELECT RUN_METRIC('android/process_counter_span_view.sql',
   'table_name', 'java_heap_kb',
   'counter_name', 'Heap size (KB)');
 
diff --git a/src/tracing/test/api_integrationtest.cc b/src/tracing/test/api_integrationtest.cc
index 1d48dd5..d44489a 100644
--- a/src/tracing/test/api_integrationtest.cc
+++ b/src/tracing/test/api_integrationtest.cc
@@ -1307,6 +1307,46 @@
   perfetto::TrackEvent::EraseTrackDescriptor(track);
 }
 
+TEST_F(PerfettoApiTest, TrackEventCustomTrackAndTimestampNoLambda) {
+  auto* tracing_session = NewTraceWithCategories({"bar"});
+  tracing_session->get()->StartBlocking();
+
+  perfetto::Track track(789);
+
+  constexpr uint64_t kBeginEventTime = 10;
+  constexpr uint64_t kEndEventTime = 15;
+  TRACE_EVENT_BEGIN("bar", "Event", track, kBeginEventTime);
+  TRACE_EVENT_END("bar", track, kEndEventTime);
+
+  perfetto::TrackEvent::Flush();
+  tracing_session->get()->StopBlocking();
+
+  std::vector<char> raw_trace = tracing_session->get()->ReadTraceBlocking();
+  perfetto::protos::gen::Trace trace;
+  ASSERT_TRUE(trace.ParseFromArray(raw_trace.data(), raw_trace.size()));
+
+  int event_count = 0;
+  for (const auto& packet : trace.packet()) {
+    if (!packet.has_track_event())
+      continue;
+    event_count++;
+    switch (packet.track_event().type()) {
+      case perfetto::protos::gen::TrackEvent::TYPE_SLICE_BEGIN:
+        EXPECT_EQ(packet.timestamp(), kBeginEventTime);
+        break;
+      case perfetto::protos::gen::TrackEvent::TYPE_SLICE_END:
+        EXPECT_EQ(packet.timestamp(), kEndEventTime);
+        break;
+      case perfetto::protos::gen::TrackEvent::TYPE_INSTANT:
+      case perfetto::protos::gen::TrackEvent::TYPE_COUNTER:
+      case perfetto::protos::gen::TrackEvent::TYPE_UNSPECIFIED:
+        ADD_FAILURE();
+    }
+  }
+
+  EXPECT_EQ(event_count, 2);
+}
+
 TEST_F(PerfettoApiTest, TrackEventAnonymousCustomTrack) {
   // Create a new trace session.
   auto* tracing_session = NewTraceWithCategories({"bar"});
diff --git a/tools/trace_processor b/tools/trace_processor
index 6476d14..b79af18 100755
--- a/tools/trace_processor
+++ b/tools/trace_processor
@@ -31,8 +31,8 @@
 import urllib
 
 TRACE_PROCESSOR_SHELL_SHAS = {
-    'linux': '7532ce79b260993018fdd515fdf99d3151ce48d4',
-    'mac': 'ed29b0eefe4f209504c18400b844cb00b4bc323b',
+    'linux': '3a28532ba5cb1b94cea8a563bbfa7d16175f208d',
+    'mac': '637fe7ac61f1700edd2fbaa76e0775ea97f4c394',
 }
 TRACE_PROCESSOR_SHELL_PATH = tempfile.gettempdir()
 TRACE_PROCESSOR_SHELL_BASE_URL = ('https://storage.googleapis.com/perfetto/')
diff --git a/tools/traceconv b/tools/traceconv
index 6adbade..964cca3 100755
--- a/tools/traceconv
+++ b/tools/traceconv
@@ -33,8 +33,8 @@
 # Keep this in sync with the SHAs in catapult file
 # systrace/systrace/tracing_agents/atrace_from_file_agent.py.
 TRACE_TO_TEXT_SHAS = {
-    'linux': '33d496605b3c861f98e8467ad5a5d974aa0720ea',
-    'mac': 'ecc0f5862fcde5e458d6edf3f3d1b03b609db091',
+    'linux': '2f4ee64e3f2135f698ee665d91c489e129fe7859',
+    'mac': 'd000e01827c439357a4d6e6c5b1076357e561a26',
 }
 TRACE_TO_TEXT_PATH = tempfile.gettempdir()
 TRACE_TO_TEXT_BASE_URL = ('https://storage.googleapis.com/perfetto/')