Merge changes I485a362d,I7a1ba66f into main
* changes:
Update clang for standalone builds
make base::Uuid and cmd getopt thread-safe via mutex
diff --git a/Android.bp b/Android.bp
index 73487c9..a4b4894 100644
--- a/Android.bp
+++ b/Android.bp
@@ -11986,6 +11986,7 @@
"src/trace_processor/perfetto_sql/stdlib/android/job_scheduler.sql",
"src/trace_processor/perfetto_sql/stdlib/android/monitor_contention.sql",
"src/trace_processor/perfetto_sql/stdlib/android/network_packets.sql",
+ "src/trace_processor/perfetto_sql/stdlib/android/oom_adjuster.sql",
"src/trace_processor/perfetto_sql/stdlib/android/process_metadata.sql",
"src/trace_processor/perfetto_sql/stdlib/android/screenshots.sql",
"src/trace_processor/perfetto_sql/stdlib/android/services.sql",
@@ -12028,6 +12029,7 @@
"src/trace_processor/perfetto_sql/stdlib/sched/thread_state_flattened.sql",
"src/trace_processor/perfetto_sql/stdlib/slices/flat_slices.sql",
"src/trace_processor/perfetto_sql/stdlib/slices/slices.sql",
+ "src/trace_processor/perfetto_sql/stdlib/slices/with_context.sql",
"src/trace_processor/perfetto_sql/stdlib/time/conversion.sql",
],
cmd: "$(location tools/gen_amalgamated_sql.py) --namespace=stdlib --cpp-out=$(out) $(in)",
diff --git a/BUILD b/BUILD
index a60811a..fe8598c 100644
--- a/BUILD
+++ b/BUILD
@@ -2374,6 +2374,7 @@
"src/trace_processor/perfetto_sql/stdlib/android/job_scheduler.sql",
"src/trace_processor/perfetto_sql/stdlib/android/monitor_contention.sql",
"src/trace_processor/perfetto_sql/stdlib/android/network_packets.sql",
+ "src/trace_processor/perfetto_sql/stdlib/android/oom_adjuster.sql",
"src/trace_processor/perfetto_sql/stdlib/android/process_metadata.sql",
"src/trace_processor/perfetto_sql/stdlib/android/screenshots.sql",
"src/trace_processor/perfetto_sql/stdlib/android/services.sql",
@@ -2486,6 +2487,7 @@
srcs = [
"src/trace_processor/perfetto_sql/stdlib/slices/flat_slices.sql",
"src/trace_processor/perfetto_sql/stdlib/slices/slices.sql",
+ "src/trace_processor/perfetto_sql/stdlib/slices/with_context.sql",
],
)
diff --git a/python/generators/sql_processing/docs_parse.py b/python/generators/sql_processing/docs_parse.py
index ea0b90e..6e8cd60 100644
--- a/python/generators/sql_processing/docs_parse.py
+++ b/python/generators/sql_processing/docs_parse.py
@@ -20,9 +20,15 @@
from typing import Any, Dict, List, Optional, Set, Tuple, NamedTuple
from python.generators.sql_processing.docs_extractor import DocsExtractor
-from python.generators.sql_processing.utils import ALLOWED_PREFIXES, ANY_PATTERN, ARG_DEFINITION_PATTERN, ObjKind
-from python.generators.sql_processing.utils import ARG_ANNOTATION_PATTERN
+from python.generators.sql_processing.utils import ObjKind
+
+from python.generators.sql_processing.utils import ALLOWED_PREFIXES
+from python.generators.sql_processing.utils import OBJECT_NAME_ALLOWLIST
+
from python.generators.sql_processing.utils import COLUMN_ANNOTATION_PATTERN
+from python.generators.sql_processing.utils import ANY_PATTERN
+from python.generators.sql_processing.utils import ARG_DEFINITION_PATTERN
+from python.generators.sql_processing.utils import ARG_ANNOTATION_PATTERN
def is_internal(name: str) -> bool:
@@ -64,6 +70,8 @@
if prefix == allowed_name_prefix:
return None
allowed_prefixes.append(allowed_name_prefix)
+ if path in OBJECT_NAME_ALLOWLIST and name in OBJECT_NAME_ALLOWLIST[path]:
+ return None
return (
f'Names of tables/views/functions at path "{path}" should be prefixed '
f'with one of following names: {", ".join(allowed_prefixes)}')
diff --git a/python/generators/sql_processing/utils.py b/python/generators/sql_processing/utils.py
index 49564dd..ba14110 100644
--- a/python/generators/sql_processing/utils.py
+++ b/python/generators/sql_processing/utils.py
@@ -111,6 +111,12 @@
'counters': 'counter',
'chrome/util': 'cr',
'graphs': 'graph',
+ 'slices': 'slice'
+}
+
+# Allows for nonstandard object names.
+OBJECT_NAME_ALLOWLIST = {
+ 'slices/with_context.sql': ['process_slice', 'thread_slice']
}
# Given a regex pattern and a string to match against, returns all the
diff --git a/src/trace_processor/metrics/sql/common/parent_slice.sql b/src/trace_processor/metrics/sql/common/parent_slice.sql
index 1f24720..d5c6f24 100644
--- a/src/trace_processor/metrics/sql/common/parent_slice.sql
+++ b/src/trace_processor/metrics/sql/common/parent_slice.sql
@@ -14,4 +14,4 @@
-- limitations under the License.
--
-INCLUDE PERFETTO MODULE common.slices;
+INCLUDE PERFETTO MODULE deprecated.v42.common.slices;
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/BUILD.gn b/src/trace_processor/perfetto_sql/stdlib/android/BUILD.gn
index be50773..29c4b89 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/BUILD.gn
+++ b/src/trace_processor/perfetto_sql/stdlib/android/BUILD.gn
@@ -31,6 +31,7 @@
"job_scheduler.sql",
"monitor_contention.sql",
"network_packets.sql",
+ "oom_adjuster.sql",
"process_metadata.sql",
"screenshots.sql",
"services.sql",
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/app_process_starts.sql b/src/trace_processor/perfetto_sql/stdlib/android/app_process_starts.sql
index 45c6e93..2e68b5f 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/app_process_starts.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/android/app_process_starts.sql
@@ -13,7 +13,7 @@
-- See the License for the specific language governing permissions and
-- limitations under the License.
--
-INCLUDE PERFETTO MODULE common.slices;
+INCLUDE PERFETTO MODULE slices.with_context;
-- All process starts.
CREATE PERFETTO VIEW _proc_start
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/freezer.sql b/src/trace_processor/perfetto_sql/stdlib/android/freezer.sql
index 14e3a01..9ccdca9 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/freezer.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/android/freezer.sql
@@ -48,6 +48,45 @@
ORDER BY upid DESC
LIMIT 1;
+-- Translate unfreeze reason from INT to STRING.
+-- See: frameworks/proto_logging/stats/atoms.proto
+CREATE PERFETTO FUNCTION _translate_unfreeze_reason(reason INT)
+RETURNS STRING
+AS
+SELECT
+ CASE
+ WHEN $reason = 0 THEN 'none'
+ WHEN $reason = 1 THEN 'activity'
+ WHEN $reason = 2 THEN 'finish_receiver'
+ WHEN $reason = 3 THEN 'start_receiver'
+ WHEN $reason = 4 THEN 'bind_service'
+ WHEN $reason = 5 THEN 'unbind_service'
+ WHEN $reason = 6 THEN 'start_service'
+ WHEN $reason = 7 THEN 'get_provider'
+ WHEN $reason = 8 THEN 'remove_provider'
+ WHEN $reason = 9 THEN 'ui_visibility'
+ WHEN $reason = 10 THEN 'allowlist'
+ WHEN $reason = 11 THEN 'process_begin'
+ WHEN $reason = 12 THEN 'process_end'
+ WHEN $reason = 13 THEN 'trim_memory'
+ WHEN $reason = 15 THEN 'ping'
+ WHEN $reason = 16 THEN 'file_locks'
+ WHEN $reason = 17 THEN 'file_lock_check_failure'
+ WHEN $reason = 18 THEN 'binder_txns'
+ WHEN $reason = 19 THEN 'feature_flags'
+ WHEN $reason = 20 THEN 'short_fgs_timeout'
+ WHEN $reason = 21 THEN 'system_init'
+ WHEN $reason = 22 THEN 'backup'
+ WHEN $reason = 23 THEN 'shell'
+ WHEN $reason = 24 THEN 'remove_task'
+ WHEN $reason = 25 THEN 'uid_idle'
+ WHEN $reason = 26 THEN 'stop_service'
+ WHEN $reason = 27 THEN 'executing_service'
+ WHEN $reason = 28 THEN 'restriction_change'
+ WHEN $reason = 29 THEN 'component_disabled'
+ ELSE NULL
+ END;
+
-- All frozen processes and their frozen duration.
CREATE PERFETTO TABLE android_freezer_events (
-- Upid of frozen process
@@ -57,19 +96,25 @@
-- Timestamp process was frozen.
ts INT,
-- Duration process was frozen for.
- dur INT
+ dur INT,
+ -- Unfreeze reason Integer.
+ unfreeze_reason_int INT,
+ -- Unfreeze reason String.
+ unfreeze_reason_str INT
)
AS
WITH
freeze AS (
SELECT ts, _extract_freezer_pid(name) AS pid,
- _pid_to_upid(_extract_freezer_pid(name), ts) AS upid, 'freeze' AS type
+ _pid_to_upid(_extract_freezer_pid(name), ts) AS upid, 'freeze' AS type,
+ NULL AS unfreeze_reason
FROM slice
WHERE name GLOB 'Freeze *:*'
),
unfreeze AS (
SELECT ts, _extract_freezer_pid(name) AS pid,
- _pid_to_upid(_extract_freezer_pid(name), ts) AS upid, 'unfreeze' AS type
+ _pid_to_upid(_extract_freezer_pid(name), ts) AS upid, 'unfreeze' AS type,
+ str_split(name, ' ', 2) AS unfreeze_reason
FROM slice
WHERE name GLOB 'Unfreeze *:*'
),
@@ -84,9 +129,16 @@
upid,
pid,
ts,
- ifnull(lead(ts) OVER (PARTITION BY upid ORDER BY ts), trace_end()) - ts AS dur
+ ifnull(lead(ts) OVER (PARTITION BY upid ORDER BY ts), trace_end()) - ts AS dur,
+ CAST(lead(unfreeze_reason) OVER (PARTITION BY upid ORDER BY ts) AS INT) AS unfreeze_reason
FROM merged
)
-SELECT upid, pid, ts, dur
+SELECT
+ upid,
+ pid,
+ ts,
+ dur,
+ unfreeze_reason AS unfreeze_reason_int,
+ _translate_unfreeze_reason(unfreeze_reason) AS unfreeze_reason_str
FROM starts
WHERE starts.type = 'freeze' AND upid IS NOT NULL;
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/garbage_collection.sql b/src/trace_processor/perfetto_sql/stdlib/android/garbage_collection.sql
index cb16f28..8481657 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/garbage_collection.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/android/garbage_collection.sql
@@ -14,7 +14,7 @@
-- limitations under the License.
--
-INCLUDE PERFETTO MODULE common.slices;
+INCLUDE PERFETTO MODULE slices.with_context;
-- Collect all GC slices. There's typically one enclosing slice but sometimes the
-- CompactionPhase is outside the nesting and we need to include that.
@@ -43,8 +43,14 @@
gc_name,
ts AS gc_ts,
ts,
- gc_dur + IIF(compact_name = 'CompactionPhase', compact_dur, 0) AS gc_dur,
- gc_dur + IIF(compact_name = 'CompactionPhase', compact_dur, 0) AS dur,
+ gc_dur + IIF(
+ compact_name = 'CompactionPhase' OR compact_name = 'Background concurrent copying GC',
+ compact_dur,
+ 0) AS gc_dur,
+ gc_dur + IIF(
+ compact_name = 'CompactionPhase' OR compact_name = 'Background concurrent copying GC',
+ compact_dur,
+ 0) AS dur,
utid,
tid,
upid,
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/oom_adjuster.sql b/src/trace_processor/perfetto_sql/stdlib/android/oom_adjuster.sql
new file mode 100644
index 0000000..9c184e5
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/android/oom_adjuster.sql
@@ -0,0 +1,129 @@
+--
+-- Copyright 2024 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.
+--
+
+INCLUDE PERFETTO MODULE common.slices;
+INCLUDE PERFETTO MODULE counters.intervals;
+
+-- Converts an oom_adj score Integer to String bucket name.
+CREATE PERFETTO FUNCTION android_oom_adj_score_to_bucket_name(
+ -- oom_adj score.
+ value INT,
+ -- android_app id of the process.
+ android_appid INT)
+-- Returns the oom_adj bucket.
+RETURNS STRING
+AS
+SELECT
+ CASE
+ WHEN $value = -1000 THEN 'native'
+ WHEN $value = -900 THEN 'system'
+ WHEN $value = -800 THEN 'persistent'
+ WHEN $value = -700 THEN 'persistent'
+ WHEN $value = -600 THEN 'logcat'
+ WHEN $value = 0 THEN 'foreground_app'
+ WHEN $value = 50 THEN 'perceptible_foreground_app'
+ WHEN $value BETWEEN 100 AND 199 THEN 'visible_app'
+ WHEN $value BETWEEN 200 AND 224 THEN 'perceptible_app'
+ WHEN $value BETWEEN 225 AND 249 THEN 'perceptible_medium_app'
+ WHEN $value BETWEEN 250 AND 299 THEN 'perceptible_low_app'
+ WHEN $value BETWEEN 300 AND 399 THEN 'backup'
+ WHEN $value BETWEEN 400 AND 499 THEN 'heavy_weight_app'
+ WHEN $value BETWEEN 500 AND 599 THEN 'service'
+ WHEN $value BETWEEN 600 AND 699 THEN 'home_app'
+ WHEN $value BETWEEN 700 AND 799 THEN 'previous_app'
+ WHEN $value BETWEEN 800 AND 899 THEN 'service_b'
+ WHEN $value BETWEEN 900 AND 949 THEN 'cached_app'
+ WHEN $value >= 950 THEN 'cached_app_lmk_first'
+ WHEN $android_appid IS NULL THEN 'unknown'
+ WHEN $android_appid < 10000 THEN 'unknown_native'
+ ELSE 'unknown_app'
+ END;
+
+-- All oom adj state intervals across all processes along with the reason for the state update.
+CREATE PERFETTO TABLE android_oom_adj_intervals (
+ -- Timestamp the oom_adj score of the process changed
+ ts INT,
+ -- Duration until the next oom_adj score change of the process.
+ dur INT,
+ -- oom_adj score of the process.
+ score INT,
+ -- oom_adj bucket of the process.
+ bucket STRING,
+ -- Upid of the process having an oom_adj update.
+ upid INT,
+ -- Name of the process having an oom_adj update.
+ process_name STRING,
+ -- Slice id of the latest oom_adj update in the system_server.
+ oom_adj_id INT,
+ -- Timestamp of the latest oom_adj update in the system_server.
+ oom_adj_ts INT,
+ -- Duration of the latest oom_adj update in the system_server.
+ oom_adj_dur INT,
+ -- Track id of the latest oom_adj update in the system_server
+ oom_adj_track_id INT,
+ -- Thread name of the latest oom_adj update in the system_server.
+ oom_adj_thread_name STRING,
+ -- Reason for the latest oom_adj update in the system_server.
+ oom_adj_reason STRING,
+ -- Trigger for the latest oom_adj update in the system_server.
+ oom_adj_trigger STRING
+ ) AS
+WITH
+ reason AS (
+ SELECT
+ thread_slice.id AS oom_adj_id,
+ thread_slice.ts AS oom_adj_ts,
+ thread_slice.dur AS oom_adj_dur,
+ thread_slice.track_id AS oom_adj_track_id,
+ thread_name AS oom_adj_thread_name,
+ str_split(thread_slice.name, '_', 1) AS oom_adj_reason,
+ slice.name AS oom_adj_trigger,
+ LEAD(thread_slice.ts) OVER (ORDER BY thread_slice.ts) AS oom_adj_next_ts
+ FROM thread_slice
+ JOIN slice ON slice.id = thread_slice.parent_id
+ WHERE thread_slice.name GLOB 'updateOomAdj_*' AND process_name = 'system_server'
+ )
+SELECT
+ ts,
+ dur,
+ value AS score,
+ android_oom_adj_score_to_bucket_name(value, android_appid) AS bucket,
+ process.upid,
+ process.name AS process_name,
+ reason.oom_adj_id,
+ reason.oom_adj_ts,
+ reason.oom_adj_dur,
+ reason.oom_adj_track_id,
+ reason.oom_adj_thread_name,
+ reason.oom_adj_reason,
+ reason.oom_adj_trigger
+FROM
+ counter_leading_intervals
+ !(
+ (
+ SELECT counter.*
+ FROM counter
+ JOIN counter_track track
+ ON track.id = counter.track_id AND track.name = 'oom_score_adj'
+ ))
+ counter
+JOIN process_counter_track track
+ ON counter.track_id = track.id
+JOIN process
+ USING (upid)
+LEFT JOIN reason
+ ON counter.ts BETWEEN oom_adj_ts AND COALESCE(oom_adj_next_ts, trace_end())
+WHERE track.name = 'oom_score_adj';
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/services.sql b/src/trace_processor/perfetto_sql/stdlib/android/services.sql
index e9c1c56..f0e854a 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/services.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/android/services.sql
@@ -14,7 +14,7 @@
-- limitations under the License.
--
-INCLUDE PERFETTO MODULE common.slices;
+INCLUDE PERFETTO MODULE slices.with_context;
INCLUDE PERFETTO MODULE android.binder;
INCLUDE PERFETTO MODULE graphs.search;
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/startup/startups.sql b/src/trace_processor/perfetto_sql/stdlib/android/startup/startups.sql
index a38c487..e496e7c 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/startup/startups.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/android/startup/startups.sql
@@ -13,12 +13,18 @@
-- See the License for the specific language governing permissions and
-- limitations under the License.
-INCLUDE PERFETTO MODULE common.slices;
INCLUDE PERFETTO MODULE android.process_metadata;
INCLUDE PERFETTO MODULE android.startup.startups_maxsdk28;
INCLUDE PERFETTO MODULE android.startup.startups_minsdk29;
INCLUDE PERFETTO MODULE android.startup.startups_minsdk33;
+CREATE PERFETTO FUNCTION _slice_count(
+ -- Name of the slices to counted.
+ slice_glob STRING)
+-- Number of slices with the name.
+RETURNS INT AS
+SELECT COUNT(1) FROM slice WHERE name GLOB $slice_glob;
+
-- Gather all startup data. Populate by different sdks.
CREATE PERFETTO TABLE _all_startups AS
SELECT sdk, startup_id, ts, ts_end, dur, package, startup_type FROM _startups_maxsdk28
@@ -45,9 +51,9 @@
) AS
SELECT startup_id, ts, ts_end, dur, package, startup_type FROM
_all_startups WHERE ( CASE
- WHEN slice_count('launchingActivity#*:*') > 0
+ WHEN _slice_count('launchingActivity#*:*') > 0
THEN sdk = "minsdk33"
- WHEN slice_count('MetricsLogger:*') > 0
+ WHEN _slice_count('MetricsLogger:*') > 0
THEN sdk = "minsdk29"
ELSE sdk = "maxsdk28"
END);
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/page_loads.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/page_loads.sql
index c8d1443..4b00170 100644
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/page_loads.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/chrome/page_loads.sql
@@ -7,7 +7,7 @@
-- chrome instance. Chrome instance id needs to be recorded, and used here in
-- combination with navigation id to uniquely identify page load metrics.
-INCLUDE PERFETTO MODULE common.slices;
+INCLUDE PERFETTO MODULE slices.with_context;
CREATE PERFETTO VIEW _fcp_metrics AS
SELECT
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_cause_utils.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_cause_utils.sql
index 7cad697..dbe0cca 100644
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_cause_utils.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_cause_utils.sql
@@ -2,6 +2,8 @@
-- Use of this source code is governed by a BSD-style license that can be
-- found in the LICENSE file.
+INCLUDE PERFETTO MODULE slices.with_context;
+
-- Function to retrieve the upid for a surfaceflinger, as these are attributed
-- to the GPU but are recorded on a different data source (and track group).
CREATE PERFETTO FUNCTION _get_process_id_for_surfaceflinger()
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_intervals.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_intervals.sql
index d85d7c6..5fb66d6 100644
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_intervals.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_intervals.sql
@@ -4,7 +4,6 @@
INCLUDE PERFETTO MODULE chrome.chrome_scrolls;
INCLUDE PERFETTO MODULE chrome.scroll_jank.scroll_jank_v3;
-INCLUDE PERFETTO MODULE common.slices;
-- Selects EventLatency slices that correspond with janks in a scroll. This is
-- based on the V3 version of scroll jank metrics.
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3.sql
index ce20041..4bc9513 100644
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3.sql
@@ -2,13 +2,63 @@
-- Use of this source code is governed by a BSD-style license that can be
-- found in the LICENSE file.
-INCLUDE PERFETTO MODULE common.slices;
+INCLUDE PERFETTO MODULE deprecated.v42.common.slices;
-- Hardware info is useful when using sql metrics for analysis
-- in BTP.
INCLUDE PERFETTO MODULE chrome.metadata;
INCLUDE PERFETTO MODULE chrome.scroll_jank.scroll_jank_v3_cause;
+-- Checks if slice has a descendant with provided name.
+CREATE PERFETTO FUNCTION _has_descendant_slice_with_name(
+ -- Id of the slice to check descendants of.
+ id INT,
+ -- Name of potential descendant slice.
+ descendant_name STRING
+)
+-- Whether `descendant_name` is a name of an descendant slice.
+RETURNS BOOL AS
+SELECT EXISTS(
+ SELECT 1
+ FROM descendant_slice($id)
+ WHERE name = $descendant_name
+ LIMIT 1
+);
+
+-- Finds the end timestamp for a given slice's descendant with a given name.
+-- If there are multiple descendants with a given name, the function will return the
+-- first one, so it's most useful when working with a timeline broken down into phases,
+-- where each subphase can happen only once.
+CREATE PERFETTO FUNCTION _descendant_slice_end(
+ -- Id of the parent slice.
+ parent_id INT,
+ -- Name of the child with the desired end TS.
+ child_name STRING
+)
+-- End timestamp of the child or NULL if it doesn't exist.
+RETURNS INT AS
+SELECT
+ CASE WHEN s.dur
+ IS NOT -1 THEN s.ts + s.dur
+ ELSE NULL
+ END
+FROM descendant_slice($parent_id) s
+WHERE s.name = $child_name
+LIMIT 1;
+
+-- Given a slice id, returns the name of the slice.
+CREATE PERFETTO FUNCTION _slice_name_from_id(
+ -- The slice id which we need the name for.
+ id LONG
+)
+-- The name of slice with the given id.
+RETURNS STRING AS
+SELECT
+ name
+FROM slice
+WHERE $id = id;
+
+
-- Grabs all gesture updates with respective scroll ids and start/end
-- timestamps, regardless of being coalesced.
CREATE PERFETTO TABLE chrome_gesture_scroll_updates(
@@ -135,8 +185,8 @@
slice.ts,
slice.id AS event_latency_id,
slice.dur AS dur,
- descendant_slice_end(slice.id, "LatchToSwapEnd") AS input_latency_end_ts,
- descendant_slice_end(slice.id, "SwapEndToPresentationCompositorFrame") AS presentation_timestamp,
+ _descendant_slice_end(slice.id, "LatchToSwapEnd") AS input_latency_end_ts,
+ _descendant_slice_end(slice.id, "SwapEndToPresentationCompositorFrame") AS presentation_timestamp,
EXTRACT_ARG(arg_set_id, 'event_latency.event_type') AS event_type
FROM slice
WHERE name = "EventLatency"
@@ -144,7 +194,7 @@
"GESTURE_SCROLL_UPDATE",
"FIRST_GESTURE_SCROLL_UPDATE",
"INERTIAL_GESTURE_SCROLL_UPDATE")
- AND has_descendant_slice_with_name(slice.id, "SwapEndToPresentationCompositorFrame");
+ AND _has_descendant_slice_with_name(slice.id, "SwapEndToPresentationCompositorFrame");
-- Join presented gesture scrolls with their respective event
-- latencies based on |LatchToSwapEnd| timestamp, as it's the
@@ -384,8 +434,8 @@
scroll_id INT
) AS
SELECT
- slice_name_from_id(cause_id) AS cause_of_jank,
- slice_name_from_id(
+ _slice_name_from_id(cause_id) AS cause_of_jank,
+ _slice_name_from_id(
-- Getting sub-cause
chrome_get_v3_jank_cause_id(
-- Here the cause itself is the parent.
@@ -394,7 +444,7 @@
(SELECT
id
FROM slice
- WHERE name = slice_name_from_id(cause_id)
+ WHERE name = _slice_name_from_id(cause_id)
AND parent_id = prev_event_latency_id)
)) AS sub_cause_of_jank,
delay_since_last_frame,
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3_cause.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3_cause.sql
index d746457..16a5246 100644
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3_cause.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3_cause.sql
@@ -2,10 +2,51 @@
-- Use of this source code is governed by a BSD-style license that can be
-- found in the LICENSE file.
--- Helper functions for scroll_jank_v3 metric computation.
-
-INCLUDE PERFETTO MODULE common.slices;
-
+-- Finds all slices with a direct parent with the given parent_id.
+CREATE PERFETTO FUNCTION _direct_children_slice(
+ -- Id of the parent slice.
+ parent_id LONG)
+RETURNS TABLE(
+ -- Alias for `slice.id`.
+ id LONG,
+ -- Alias for `slice.type`.
+ type STRING,
+ -- Alias for `slice.ts`.
+ ts LONG,
+ -- Alias for `slice.dur`.
+ dur LONG,
+ -- Alias for `slice.category`.
+ category LONG,
+ -- Alias for `slice.name`.
+ name STRING,
+ -- Alias for `slice.track_id`.
+ track_id LONG,
+ -- Alias for `slice.depth`.
+ depth LONG,
+ -- Alias for `slice.parent_id`.
+ parent_id LONG,
+ -- Alias for `slice.arg_set_id`.
+ arg_set_id LONG,
+ -- Alias for `slice.thread_ts`.
+ thread_ts LONG,
+ -- Alias for `slice.thread_dur`.
+ thread_dur LONG
+) AS
+SELECT
+ slice.id,
+ slice.type,
+ slice.ts,
+ slice.dur,
+ slice.category,
+ slice.name,
+ slice.track_id,
+ slice.depth,
+ slice.parent_id,
+ slice.arg_set_id,
+ slice.thread_ts,
+ slice.thread_dur
+FROM slice
+WHERE parent_id = $parent_id;
-- Given two slice Ids A and B, find the maximum difference
-- between the durations of it's direct children with matching names
@@ -26,12 +67,12 @@
current_breakdowns AS (
SELECT
*
- FROM direct_children_slice($janky_slice_id)
+ FROM _direct_children_slice($janky_slice_id)
),
prev_breakdowns AS (
SELECT
*
- FROM direct_children_slice($prev_slice_id)
+ FROM _direct_children_slice($prev_slice_id)
),
joint_breakdowns AS (
SELECT
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/startups.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/startups.sql
index f1e852b..7e45848 100644
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/startups.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/chrome/startups.sql
@@ -2,7 +2,7 @@
-- Use of this source code is governed by a BSD-style license that can be
-- found in the LICENSE file.
-INCLUDE PERFETTO MODULE common.slices;
+INCLUDE PERFETTO MODULE slices.with_context;
-- Access all startups, including those that don't lead to any visible content.
-- If TimeToFirstVisibleContent is available, then this event will be the
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/tasks.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/tasks.sql
index 420ef6b..a177cba 100644
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/tasks.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/chrome/tasks.sql
@@ -2,7 +2,20 @@
-- Use of this source code is governed by a BSD-style license that can be
-- found in the LICENSE file.
-INCLUDE PERFETTO MODULE common.slices;
+-- Checks if slice has an ancestor with provided name.
+CREATE PERFETTO FUNCTION _has_parent_slice_with_name(
+ -- Id of the slice to check parents of.
+ id INT,
+ -- Name of potential ancestor slice.
+ parent_name STRING)
+-- Whether `parent_name` is a name of an ancestor slice.
+RETURNS BOOL AS
+SELECT EXISTS(
+ SELECT 1
+ FROM ancestor_slice($id)
+ WHERE name = $parent_name
+ LIMIT 1
+);
-- Returns the mojo ipc hash for a given task, looking it up from the
-- argument of descendant ScopedSetIpcHash slice.
@@ -229,11 +242,11 @@
s1.*,
-- While the parent slices are too generic to be used by themselves,
-- they can provide some useful metadata.
- has_parent_slice_with_name(
+ _has_parent_slice_with_name(
s1.id,
"ViewResourceAdapter:captureWithSoftwareDraw"
) AS is_software_screenshot,
- has_parent_slice_with_name(
+ _has_parent_slice_with_name(
s1.id,
"ViewResourceAdapter:captureWithHardwareDraw"
) AS is_hardware_screenshot
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/web_content_interactions.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/web_content_interactions.sql
index d60992f..76ada01 100644
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/web_content_interactions.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/chrome/web_content_interactions.sql
@@ -2,7 +2,7 @@
-- Use of this source code is governed by a BSD-style license that can be
-- found in the LICENSE file.
-INCLUDE PERFETTO MODULE common.slices;
+INCLUDE PERFETTO MODULE slices.with_context;
-- Chrome web content interactions (InteractionToFirstPaint), including
-- associated high-level metrics and properties.
diff --git a/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/slices.sql b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/slices.sql
index 84badb6..05b6b21 100644
--- a/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/slices.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/slices.sql
@@ -13,129 +13,7 @@
-- See the License for the specific language governing permissions and
-- limitations under the License.
--- All thread slices with data about thread, thread track and process.
--- Where possible, use available view functions which filter this view.
-CREATE PERFETTO VIEW thread_slice(
- -- Alias for `slice.id`.
- id INT,
- -- Alias for `slice.type`.
- type STRING,
- -- Alias for `slice.ts`.
- ts INT,
- -- Alias for `slice.dur`.
- dur INT,
- -- Alias for `slice.category`.
- category STRING,
- -- Alias for `slice.name`.
- name STRING,
- -- Alias for `slice.track_id`.
- track_id INT,
- -- Alias for `thread_track.name`.
- track_name STRING,
- -- Alias for `thread.name`.
- thread_name STRING,
- -- Alias for `thread.utid`.
- utid INT,
- -- Alias for `thread.tid`
- tid INT,
- -- Alias for `process.name`.
- process_name STRING,
- -- Alias for `process.upid`.
- upid INT,
- -- Alias for `process.pid`.
- pid INT,
- -- Alias for `slice.depth`.
- depth INT,
- -- Alias for `slice.parent_id`.
- parent_id INT,
- -- Alias for `slice.arg_set_id`.
- arg_set_id INT,
- -- Alias for `slice.thread_ts`.
- thread_ts INT,
- -- Alias for `slice.thread_dur`.
- thread_dur INT
-) AS
-SELECT
- slice.id,
- slice.type,
- slice.ts,
- slice.dur,
- slice.category,
- slice.name,
- slice.track_id,
- thread_track.name AS track_name,
- thread.name AS thread_name,
- thread.utid,
- thread.tid,
- process.name AS process_name,
- process.upid,
- process.pid,
- slice.depth,
- slice.parent_id,
- slice.arg_set_id,
- slice.thread_ts,
- slice.thread_dur
-FROM slice
-JOIN thread_track ON slice.track_id = thread_track.id
-JOIN thread USING (utid)
-LEFT JOIN process USING (upid);
-
--- All process slices with data about process track and process.
--- Where possible, use available view functions which filter this view.
-CREATE PERFETTO VIEW process_slice(
- -- Alias for `slice.id`.
- id INT,
- -- Alias for `slice.type`.
- type STRING,
- -- Alias for `slice.ts`.
- ts INT,
- -- Alias for `slice.dur`.
- dur INT,
- -- Alias for `slice.category`.
- category STRING,
- -- Alias for `slice.name`.
- name STRING,
- -- Alias for `slice.track_id`.
- track_id INT,
- -- Alias for `process_track.name`.
- track_name STRING,
- -- Alias for `process.name`.
- process_name STRING,
- -- Alias for `process.upid`.
- upid INT,
- -- Alias for `process.pid`.
- pid INT,
- -- Alias for `slice.depth`.
- depth INT,
- -- Alias for `slice.parent_id`.
- parent_id INT,
- -- Alias for `slice.arg_set_id`.
- arg_set_id INT,
- -- Alias for `slice.thread_ts`.
- thread_ts INT,
- -- Alias for `slice.thread_dur`.
- thread_dur INT
-) AS
-SELECT
- slice.id,
- slice.type,
- slice.ts,
- slice.dur,
- slice.category,
- slice.name,
- slice.track_id,
- process_track.name AS track_name,
- process.name AS process_name,
- process.upid,
- process.pid,
- slice.depth,
- slice.parent_id,
- slice.arg_set_id,
- slice.thread_ts,
- slice.thread_dur
-FROM slice
-JOIN process_track ON slice.track_id = process_track.id
-JOIN process USING (upid);
+INCLUDE PERFETTO MODULE slices.with_context;
-- Checks if slice has an ancestor with provided name.
CREATE PERFETTO FUNCTION has_parent_slice_with_name(
@@ -168,14 +46,6 @@
LIMIT 1
);
--- Count slices with specified name.
-CREATE PERFETTO FUNCTION slice_count(
- -- Name of the slices to counted.
- slice_glob STRING)
--- Number of slices with the name.
-RETURNS INT AS
-SELECT COUNT(1) FROM slice WHERE name GLOB $slice_glob;;
-
-- Finds the end timestamp for a given slice's descendant with a given name.
-- If there are multiple descendants with a given name, the function will return the
-- first one, so it's most useful when working with a timeline broken down into phases,
@@ -254,3 +124,10 @@
name
FROM slice
WHERE $id = id;
+
+CREATE PERFETTO FUNCTION slice_count(
+ -- Name of the slices to counted.
+ slice_glob STRING)
+-- Number of slices with the name.
+RETURNS INT AS
+SELECT COUNT(1) FROM slice WHERE name GLOB $slice_glob;
diff --git a/src/trace_processor/perfetto_sql/stdlib/sched/thread_executing_span.sql b/src/trace_processor/perfetto_sql/stdlib/sched/thread_executing_span.sql
index 8e74d2f..19f68c2 100644
--- a/src/trace_processor/perfetto_sql/stdlib/sched/thread_executing_span.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/sched/thread_executing_span.sql
@@ -14,7 +14,6 @@
-- limitations under the License.
--
-INCLUDE PERFETTO MODULE common.slices;
INCLUDE PERFETTO MODULE slices.flat_slices;
-- A 'thread_executing_span' is thread_state span starting with a runnable slice
diff --git a/src/trace_processor/perfetto_sql/stdlib/slices/BUILD.gn b/src/trace_processor/perfetto_sql/stdlib/slices/BUILD.gn
index ac79369..2e5f02f 100644
--- a/src/trace_processor/perfetto_sql/stdlib/slices/BUILD.gn
+++ b/src/trace_processor/perfetto_sql/stdlib/slices/BUILD.gn
@@ -18,5 +18,6 @@
sources = [
"flat_slices.sql",
"slices.sql",
+ "with_context.sql",
]
}
diff --git a/src/trace_processor/perfetto_sql/stdlib/slices/slices.sql b/src/trace_processor/perfetto_sql/stdlib/slices/slices.sql
index 20383b3..9b08700 100644
--- a/src/trace_processor/perfetto_sql/stdlib/slices/slices.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/slices/slices.sql
@@ -13,8 +13,6 @@
-- See the License for the specific language governing permissions and
-- limitations under the License.
-INCLUDE PERFETTO MODULE common.slices;
-
-- All slices with related process and thread info if available. Unlike
-- `thread_slice` and `process_slice`, this view contains all slices,
-- with thread- and process-related columns set to NULL if the slice
diff --git a/src/trace_processor/perfetto_sql/stdlib/slices/with_context.sql b/src/trace_processor/perfetto_sql/stdlib/slices/with_context.sql
new file mode 100644
index 0000000..6e9ba0d
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/slices/with_context.sql
@@ -0,0 +1,138 @@
+--
+-- Copyright 2024 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.
+
+-- All thread slices with data about thread, thread track and process.
+-- Where possible, use available view functions which filter this view.
+CREATE PERFETTO VIEW thread_slice(
+ -- Alias for `slice.id`.
+ id INT,
+ -- Alias for `slice.type`.
+ type STRING,
+ -- Alias for `slice.ts`.
+ ts INT,
+ -- Alias for `slice.dur`.
+ dur INT,
+ -- Alias for `slice.category`.
+ category STRING,
+ -- Alias for `slice.name`.
+ name STRING,
+ -- Alias for `slice.track_id`.
+ track_id INT,
+ -- Alias for `thread_track.name`.
+ track_name STRING,
+ -- Alias for `thread.name`.
+ thread_name STRING,
+ -- Alias for `thread.utid`.
+ utid INT,
+ -- Alias for `thread.tid`
+ tid INT,
+ -- Alias for `process.name`.
+ process_name STRING,
+ -- Alias for `process.upid`.
+ upid INT,
+ -- Alias for `process.pid`.
+ pid INT,
+ -- Alias for `slice.depth`.
+ depth INT,
+ -- Alias for `slice.parent_id`.
+ parent_id INT,
+ -- Alias for `slice.arg_set_id`.
+ arg_set_id INT,
+ -- Alias for `slice.thread_ts`.
+ thread_ts INT,
+ -- Alias for `slice.thread_dur`.
+ thread_dur INT
+) AS
+SELECT
+ slice.id,
+ slice.type,
+ slice.ts,
+ slice.dur,
+ slice.category,
+ slice.name,
+ slice.track_id,
+ thread_track.name AS track_name,
+ thread.name AS thread_name,
+ thread.utid,
+ thread.tid,
+ process.name AS process_name,
+ process.upid,
+ process.pid,
+ slice.depth,
+ slice.parent_id,
+ slice.arg_set_id,
+ slice.thread_ts,
+ slice.thread_dur
+FROM slice
+JOIN thread_track ON slice.track_id = thread_track.id
+JOIN thread USING (utid)
+LEFT JOIN process USING (upid);
+
+-- All process slices with data about process track and process.
+-- Where possible, use available view functions which filter this view.
+CREATE PERFETTO VIEW process_slice(
+ -- Alias for `slice.id`.
+ id INT,
+ -- Alias for `slice.type`.
+ type STRING,
+ -- Alias for `slice.ts`.
+ ts INT,
+ -- Alias for `slice.dur`.
+ dur INT,
+ -- Alias for `slice.category`.
+ category STRING,
+ -- Alias for `slice.name`.
+ name STRING,
+ -- Alias for `slice.track_id`.
+ track_id INT,
+ -- Alias for `process_track.name`.
+ track_name STRING,
+ -- Alias for `process.name`.
+ process_name STRING,
+ -- Alias for `process.upid`.
+ upid INT,
+ -- Alias for `process.pid`.
+ pid INT,
+ -- Alias for `slice.depth`.
+ depth INT,
+ -- Alias for `slice.parent_id`.
+ parent_id INT,
+ -- Alias for `slice.arg_set_id`.
+ arg_set_id INT,
+ -- Alias for `slice.thread_ts`.
+ thread_ts INT,
+ -- Alias for `slice.thread_dur`.
+ thread_dur INT
+) AS
+SELECT
+ slice.id,
+ slice.type,
+ slice.ts,
+ slice.dur,
+ slice.category,
+ slice.name,
+ slice.track_id,
+ process_track.name AS track_name,
+ process.name AS process_name,
+ process.upid,
+ process.pid,
+ slice.depth,
+ slice.parent_id,
+ slice.arg_set_id,
+ slice.thread_ts,
+ slice.thread_dur
+FROM slice
+JOIN process_track ON slice.track_id = process_track.id
+JOIN process USING (upid);
\ No newline at end of file
diff --git a/test/data/freezer_trace.atr.sha256 b/test/data/freezer_trace.atr.sha256
new file mode 100644
index 0000000..bbe6a9b
--- /dev/null
+++ b/test/data/freezer_trace.atr.sha256
@@ -0,0 +1 @@
+abbffc92db09d1b7fd3452e9d5e91aebd5a13151660125c6e25776331efccc53
\ No newline at end of file
diff --git a/test/trace_processor/diff_tests/metrics/chrome/tests_scroll_jank.py b/test/trace_processor/diff_tests/metrics/chrome/tests_scroll_jank.py
index c2336ce..70dec5c 100644
--- a/test/trace_processor/diff_tests/metrics/chrome/tests_scroll_jank.py
+++ b/test/trace_processor/diff_tests/metrics/chrome/tests_scroll_jank.py
@@ -458,4 +458,76 @@
}
}
}
+ """))
+
+ def test_has_descendant_slice_with_name_true(self):
+ return DiffTestBlueprint(
+ # We need a trace with a large number of non-chrome slices, so that the
+ # reliable range is affected by their filtering.
+ trace=DataPath('chrome_input_with_frame_view.pftrace'),
+ query="""
+ INCLUDE PERFETTO MODULE chrome.scroll_jank.scroll_jank_v3;
+
+ SELECT
+ _HAS_DESCENDANT_SLICE_WITH_NAME(
+ (SELECT id from slice where dur = 46046000),
+ 'SwapEndToPresentationCompositorFrame') AS has_descendant;
+ """,
+ out=Csv("""
+ "has_descendant"
+ 1
+ """))
+
+ def test_has_descendant_slice_with_name_false(self):
+ return DiffTestBlueprint(
+ # We need a trace with a large number of non-chrome slices, so that the
+ # reliable range is affected by their filtering.
+ trace=DataPath('chrome_input_with_frame_view.pftrace'),
+ query="""
+ INCLUDE PERFETTO MODULE chrome.scroll_jank.scroll_jank_v3;
+
+ SELECT
+ _HAS_DESCENDANT_SLICE_WITH_NAME(
+ (SELECT id from slice where dur = 11666000),
+ 'SwapEndToPresentationCompositorFrame') AS has_descendant;
+ """,
+ out=Csv("""
+ "has_descendant"
+ 0
+ """))
+
+ def test_descendant_slice_null(self):
+ return DiffTestBlueprint(
+ # We need a trace with a large number of non-chrome slices, so that the
+ # reliable range is affected by their filtering.
+ trace=DataPath('chrome_input_with_frame_view.pftrace'),
+ query="""
+ INCLUDE PERFETTO MODULE chrome.scroll_jank.scroll_jank_v3;
+
+ SELECT
+ _DESCENDANT_SLICE_END(
+ (SELECT id from slice where dur = 11666000),
+ 'SwapEndToPresentationCompositorFrame') AS end_ts;
+ """,
+ out=Csv("""
+ "end_ts"
+ "[NULL]"
+ """))
+
+ def test_descendant_slice(self):
+ return DiffTestBlueprint(
+ # We need a trace with a large number of non-chrome slices, so that the
+ # reliable range is affected by their filtering.
+ trace=DataPath('chrome_input_with_frame_view.pftrace'),
+ query="""
+ INCLUDE PERFETTO MODULE chrome.scroll_jank.scroll_jank_v3;
+
+ SELECT
+ _DESCENDANT_SLICE_END(
+ (SELECT id from slice where dur = 46046000),
+ 'SwapEndToPresentationCompositorFrame') AS end_ts;
+ """,
+ out=Csv("""
+ "end_ts"
+ 174797566610797
"""))
\ No newline at end of file
diff --git a/test/trace_processor/diff_tests/stdlib/android/tests.py b/test/trace_processor/diff_tests/stdlib/android/tests.py
index ad4a5ed..23ae137 100644
--- a/test/trace_processor/diff_tests/stdlib/android/tests.py
+++ b/test/trace_processor/diff_tests/stdlib/android/tests.py
@@ -1161,14 +1161,21 @@
def test_freezer_events(self):
return DiffTestBlueprint(
- trace=DataPath('post_boot_trace.atr'),
+ trace=DataPath('freezer_trace.atr'),
query="""
INCLUDE PERFETTO MODULE android.freezer;
- SELECT pid, ts, dur FROM android_freezer_events ORDER BY ts
+ SELECT pid, ts, dur, unfreeze_reason_int, unfreeze_reason_str FROM android_freezer_events ORDER BY ts
""",
out=Csv("""
- "pid","ts","dur"
- 8361,588092720937,576298685
+ "pid","ts","dur","unfreeze_reason_int","unfreeze_reason_str"
+ 6506,91266310231819,94699935803,"[NULL]","[NULL]"
+ 3804,91266322277324,94687890298,"[NULL]","[NULL]"
+ 3299,91281767065245,78699885147,6,"start_service"
+ 5782,91296291190245,64718977377,"[NULL]","[NULL]"
+ 6533,91296292403211,64717764411,"[NULL]","[NULL]"
+ 4044,91296293188372,64716979250,"[NULL]","[NULL]"
+ 4002,91296294215356,64715952266,"[NULL]","[NULL]"
+ 3981,91296294804650,64715362972,"[NULL]","[NULL]"
"""))
def test_service_bindings(self):
@@ -1213,3 +1220,38 @@
0,"com.android.bluetooth","droid.bluetooth",7639,7639,571248973750,9874358,-700,"com.android.bluetooth","binder:7639_2",7672,7639,571871169647,6460322,"android.os.BinderProxy@7482132","android.bluetooth.IBluetooth","com.android.bluetooth/.btservice.AdapterService","[NULL]",4
-700,"com.android.bluetooth","droid.bluetooth",7639,7639,572342110044,4874276,-700,"com.android.bluetooth","binder:7639_2",7672,7639,572466393291,1404185,"android.os.BinderProxy@ce5a6fc","android.media.browse.MediaBrowserService","com.android.bluetooth/.avrcpcontroller.BluetoothMediaBrowserService","[NULL]",10
"""))
+
+ def test_oom_adjuster_transitions(self):
+ return DiffTestBlueprint(
+ trace=DataPath('sched_wakeup_trace.atr'),
+ query="""
+ INCLUDE PERFETTO MODULE android.oom_adjuster;
+ SELECT
+ ts,
+ dur,
+ score,
+ bucket,
+ process_name,
+ oom_adj_ts,
+ oom_adj_dur,
+ oom_adj_thread_name,
+ oom_adj_reason,
+ oom_adj_trigger
+ FROM android_oom_adj_intervals
+ WHERE oom_adj_reason IS NOT NULL
+ ORDER BY ts
+ LIMIT 10
+ """,
+ out=Csv("""
+ "ts","dur","score","bucket","process_name","oom_adj_ts","oom_adj_dur","oom_adj_thread_name","oom_adj_reason","oom_adj_trigger"
+ 1737065264829,701108081,925,"cached_app","com.android.providers.calendar",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+ 1737066678827,3470211742,935,"cached_app","com.android.imsserviceentitlement",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+ 1737066873002,3470017567,945,"cached_app","com.android.carrierconfig",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+ 1737067058812,3469831757,955,"cached_app_lmk_first","com.android.messaging",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+ 1737067246975,699224817,955,"cached_app_lmk_first","android.process.acore",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+ 1737068421919,3468468650,965,"cached_app_lmk_first","com.android.shell",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+ 1737068599673,697908135,965,"cached_app_lmk_first","android.process.media",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+ 1737068933602,3467956967,975,"cached_app_lmk_first","com.android.gallery3d",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+ 1737069091010,3467799559,975,"cached_app_lmk_first","com.android.packageinstaller",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+ 1737069240534,3467650035,985,"cached_app_lmk_first","com.android.managedprovisioning",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+ """))
diff --git a/test/trace_processor/diff_tests/stdlib/slices/tests.py b/test/trace_processor/diff_tests/stdlib/slices/tests.py
index 9b565bb..e3db459 100644
--- a/test/trace_processor/diff_tests/stdlib/slices/tests.py
+++ b/test/trace_processor/diff_tests/stdlib/slices/tests.py
@@ -26,7 +26,7 @@
return DiffTestBlueprint(
trace=Path('trace.py'),
query="""
- INCLUDE PERFETTO MODULE common.slices;
+ INCLUDE PERFETTO MODULE slices.with_context;
SELECT name, ts, dur, depth, thread_name, tid, process_name, pid
FROM thread_slice;
@@ -40,7 +40,7 @@
return DiffTestBlueprint(
trace=Path('trace.py'),
query="""
- INCLUDE PERFETTO MODULE common.slices;
+ INCLUDE PERFETTO MODULE slices.with_context;
SELECT name, ts, dur, depth, process_name, pid
FROM process_slice;
@@ -67,77 +67,6 @@
"""))
# Common functions
- def test_has_descendant_slice_with_name_true(self):
- return DiffTestBlueprint(
- # We need a trace with a large number of non-chrome slices, so that the
- # reliable range is affected by their filtering.
- trace=DataPath('chrome_input_with_frame_view.pftrace'),
- query="""
- INCLUDE PERFETTO MODULE common.slices;
-
- SELECT
- HAS_DESCENDANT_SLICE_WITH_NAME(
- (SELECT id from slice where dur = 46046000),
- 'SwapEndToPresentationCompositorFrame') AS has_descendant;
- """,
- out=Csv("""
- "has_descendant"
- 1
- """))
-
- def test_has_descendant_slice_with_name_false(self):
- return DiffTestBlueprint(
- # We need a trace with a large number of non-chrome slices, so that the
- # reliable range is affected by their filtering.
- trace=DataPath('chrome_input_with_frame_view.pftrace'),
- query="""
- INCLUDE PERFETTO MODULE common.slices;
-
- SELECT
- HAS_DESCENDANT_SLICE_WITH_NAME(
- (SELECT id from slice where dur = 11666000),
- 'SwapEndToPresentationCompositorFrame') AS has_descendant;
- """,
- out=Csv("""
- "has_descendant"
- 0
- """))
-
- def test_descendant_slice_null(self):
- return DiffTestBlueprint(
- # We need a trace with a large number of non-chrome slices, so that the
- # reliable range is affected by their filtering.
- trace=DataPath('chrome_input_with_frame_view.pftrace'),
- query="""
- INCLUDE PERFETTO MODULE common.slices;
-
- SELECT
- DESCENDANT_SLICE_END(
- (SELECT id from slice where dur = 11666000),
- 'SwapEndToPresentationCompositorFrame') AS end_ts;
- """,
- out=Csv("""
- "end_ts"
- "[NULL]"
- """))
-
- def test_descendant_slice(self):
- return DiffTestBlueprint(
- # We need a trace with a large number of non-chrome slices, so that the
- # reliable range is affected by their filtering.
- trace=DataPath('chrome_input_with_frame_view.pftrace'),
- query="""
- INCLUDE PERFETTO MODULE common.slices;
-
- SELECT
- DESCENDANT_SLICE_END(
- (SELECT id from slice where dur = 46046000),
- 'SwapEndToPresentationCompositorFrame') AS end_ts;
- """,
- out=Csv("""
- "end_ts"
- 174797566610797
- """))
def test_slice_flattened(self):
return DiffTestBlueprint(
diff --git a/ui/src/core/feature_flags.ts b/ui/src/core/feature_flags.ts
index f00d535..5fec7bb 100644
--- a/ui/src/core/feature_flags.ts
+++ b/ui/src/core/feature_flags.ts
@@ -249,5 +249,5 @@
id: 'tabsv2',
name: 'Tabs V2',
description: 'Use Tabs V2',
- defaultValue: false,
+ defaultValue: true,
});