From 4b92c16755161a19fae97df8db1ef7c05464018e Mon Sep 17 00:00:00 2001 From: Yegor Date: Fri, 3 Apr 2020 16:51:44 -0700 Subject: [PATCH] Use "measured_frame" instead of "CrRendererMain" to detect process ID (#53969) --- dev/devicelab/lib/framework/browser.dart | 31 +++++++++++++++--------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/dev/devicelab/lib/framework/browser.dart b/dev/devicelab/lib/framework/browser.dart index 47f3ebb6842..1be915506d7 100644 --- a/dev/devicelab/lib/framework/browser.dart +++ b/dev/devicelab/lib/framework/browser.dart @@ -281,11 +281,26 @@ class BlinkTraceSummary { .toList() ..sort((BlinkTraceEvent a, BlinkTraceEvent b) => a.ts - b.ts); + // Use the pid from the first "measured_frame" event since the event is + // emitted by the script running on the process we're interested in. + // + // We previously tried using the "CrRendererMain" event. However, for + // reasons unknown, Chrome in the devicelab refuses to emit this event + // sometimes, causing to flakes. + final BlinkTraceEvent firstMeasuredFrameEvent = events.firstWhere( + (BlinkTraceEvent event) => event.isBeginMeasuredFrame, + orElse: () => null, + ); + + if (firstMeasuredFrameEvent == null) { + // This happens in benchmarks that do not measure frames, such as some + // of the text layout benchmarks. + return null; + } + + final int tabPid = firstMeasuredFrameEvent.pid; + // Filter out data from unrelated processes - final BlinkTraceEvent processLabel = events - .where((BlinkTraceEvent event) => event.isCrRendererMain) - .single; - final int tabPid = processLabel.pid; events = events.where((BlinkTraceEvent element) => element.pid == tabPid).toList(); // Extract frame data. @@ -489,14 +504,6 @@ class BlinkTraceEvent { /// This event is a duration event that has its `tdur` populated. bool get isUpdateAllLifecyclePhases => ph == 'X' && name == 'WebViewImpl::updateAllLifecyclePhases'; - /// A "CrRendererMain" event contains information about the browser's UI - /// thread. - /// - /// This event's [pid] field identifies the process that performs web page - /// rendering. The [isBeginFrame] and [isUpdateAllLifecyclePhases] events - /// with the same [pid] as this event all belong to the same web page. - bool get isCrRendererMain => name == 'thread_name' && args['name'] == 'CrRendererMain'; - /// Whether this is the beginning of a "measured_frame" event. /// /// This event is a custom event emitted by our benchmark test harness.