From 690cd87b15647dddccbe67f6526076c0161af09b Mon Sep 17 00:00:00 2001 From: Elliott Brooks <21270878+elliette@users.noreply.github.com> Date: Tue, 20 Jan 2026 12:54:16 -0800 Subject: [PATCH 1/4] Fix race conditions when computing analytics --- .../src/shared/analytics/_analytics_web.dart | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/packages/devtools_app/lib/src/shared/analytics/_analytics_web.dart b/packages/devtools_app/lib/src/shared/analytics/_analytics_web.dart index 9a2e497826f..7fbb6b3677b 100644 --- a/packages/devtools_app/lib/src/shared/analytics/_analytics_web.dart +++ b/packages/devtools_app/lib/src/shared/analytics/_analytics_web.dart @@ -746,8 +746,7 @@ set flutterClientId(String newFlutterClientId) { _flutterClientId = newFlutterClientId; } -bool _computingDimensions = false; -bool _analyticsComputed = false; +Completer? _computingDimensionsCompleter; bool _computingUserApplicationDimensions = false; bool _userApplicationDimensionsComputed = false; @@ -779,8 +778,6 @@ void _computeUserApplicationCustomGTagData() { userBuildType = connectedApp.isProfileBuildNow! ? buildTypeProfile : buildTypeDebug; - - _analyticsComputed = true; } @JS('getDevToolsPropertyID') @@ -837,12 +834,19 @@ Future computeFlutterClientId() async { } Future setupDimensions() async { - if (!_analyticsComputed && !_computingDimensions) { - _computingDimensions = true; + if (_computingDimensionsCompleter != null) { + return _computingDimensionsCompleter!.future; + } + + _computingDimensionsCompleter = Completer(); + try { computeDevToolsCustomGTagsData(); computeDevToolsQueryParams(); await computeFlutterClientId(); - _analyticsComputed = true; + } catch (e, st) { + _log.warning('Failed to compute dimensions', e, st); + } finally { + _computingDimensionsCompleter!.complete(); } } @@ -851,8 +855,14 @@ void setupUserApplicationDimensions() { !_userApplicationDimensionsComputed && !_computingUserApplicationDimensions) { _computingUserApplicationDimensions = true; - _computeUserApplicationCustomGTagData(); - _userApplicationDimensionsComputed = true; + try { + _computeUserApplicationCustomGTagData(); + } catch (e, st) { + _log.warning('Failed to compute user application dimensions', e, st); + } finally { + _userApplicationDimensionsComputed = true; + _computingUserApplicationDimensions = false; + } } } From 68b4a6354ab3b229a70d0f20fd12cb38b4cd5dc6 Mon Sep 17 00:00:00 2001 From: Elliott Brooks <21270878+elliette@users.noreply.github.com> Date: Tue, 20 Jan 2026 13:15:23 -0800 Subject: [PATCH 2/4] Clean up --- .../src/shared/analytics/_analytics_web.dart | 28 ++++++++----------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/packages/devtools_app/lib/src/shared/analytics/_analytics_web.dart b/packages/devtools_app/lib/src/shared/analytics/_analytics_web.dart index 7fbb6b3677b..8c90433cbb0 100644 --- a/packages/devtools_app/lib/src/shared/analytics/_analytics_web.dart +++ b/packages/devtools_app/lib/src/shared/analytics/_analytics_web.dart @@ -747,14 +747,10 @@ set flutterClientId(String newFlutterClientId) { } Completer? _computingDimensionsCompleter; - bool _computingUserApplicationDimensions = false; -bool _userApplicationDimensionsComputed = false; // Computes the running application. void _computeUserApplicationCustomGTagData() { - if (_userApplicationDimensionsComputed) return; - final connectedApp = serviceConnection.serviceManager.connectedApp!; assert(connectedApp.isFlutterAppNow != null); assert(connectedApp.isDartWebAppNow != null); @@ -851,18 +847,18 @@ Future setupDimensions() async { } void setupUserApplicationDimensions() { - if (serviceConnection.serviceManager.connectedApp != null && - !_userApplicationDimensionsComputed && - !_computingUserApplicationDimensions) { - _computingUserApplicationDimensions = true; - try { - _computeUserApplicationCustomGTagData(); - } catch (e, st) { - _log.warning('Failed to compute user application dimensions', e, st); - } finally { - _userApplicationDimensionsComputed = true; - _computingUserApplicationDimensions = false; - } + if (serviceConnection.serviceManager.connectedApp == null || + _computingUserApplicationDimensions) { + return; + } + + _computingUserApplicationDimensions = true; + try { + _computeUserApplicationCustomGTagData(); + } catch (e, st) { + _log.warning('Failed to compute user application dimensions', e, st); + } finally { + _computingUserApplicationDimensions = false; } } From ac4b194926467b8bb40583ed02437972588b6d23 Mon Sep 17 00:00:00 2001 From: Elliott Brooks <21270878+elliette@users.noreply.github.com> Date: Tue, 20 Jan 2026 13:27:07 -0800 Subject: [PATCH 3/4] More clean up --- .../src/shared/analytics/_analytics_web.dart | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/packages/devtools_app/lib/src/shared/analytics/_analytics_web.dart b/packages/devtools_app/lib/src/shared/analytics/_analytics_web.dart index 8c90433cbb0..4937571db62 100644 --- a/packages/devtools_app/lib/src/shared/analytics/_analytics_web.dart +++ b/packages/devtools_app/lib/src/shared/analytics/_analytics_web.dart @@ -746,8 +746,7 @@ set flutterClientId(String newFlutterClientId) { _flutterClientId = newFlutterClientId; } -Completer? _computingDimensionsCompleter; -bool _computingUserApplicationDimensions = false; +Completer? _computingDimensionsSucceededCompleter; // Computes the running application. void _computeUserApplicationCustomGTagData() { @@ -830,35 +829,34 @@ Future computeFlutterClientId() async { } Future setupDimensions() async { - if (_computingDimensionsCompleter != null) { - return _computingDimensionsCompleter!.future; + if (_computingDimensionsSucceededCompleter != null) { + await _computingDimensionsSucceededCompleter!.future; + return; } - _computingDimensionsCompleter = Completer(); + _computingDimensionsSucceededCompleter = Completer(); + bool success = false; try { computeDevToolsCustomGTagsData(); computeDevToolsQueryParams(); await computeFlutterClientId(); + success = true; } catch (e, st) { _log.warning('Failed to compute dimensions', e, st); } finally { - _computingDimensionsCompleter!.complete(); + _computingDimensionsSucceededCompleter!.complete(success); } } void setupUserApplicationDimensions() { - if (serviceConnection.serviceManager.connectedApp == null || - _computingUserApplicationDimensions) { + if (serviceConnection.serviceManager.connectedApp == null) { return; } - _computingUserApplicationDimensions = true; try { _computeUserApplicationCustomGTagData(); } catch (e, st) { _log.warning('Failed to compute user application dimensions', e, st); - } finally { - _computingUserApplicationDimensions = false; } } From 3248cc0f60d27e51e970f311a9d77d927314fd3c Mon Sep 17 00:00:00 2001 From: Elliott Brooks <21270878+elliette@users.noreply.github.com> Date: Tue, 20 Jan 2026 13:31:28 -0800 Subject: [PATCH 4/4] More clean up --- .../lib/src/shared/analytics/_analytics_web.dart | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/packages/devtools_app/lib/src/shared/analytics/_analytics_web.dart b/packages/devtools_app/lib/src/shared/analytics/_analytics_web.dart index 4937571db62..1ab55cb6367 100644 --- a/packages/devtools_app/lib/src/shared/analytics/_analytics_web.dart +++ b/packages/devtools_app/lib/src/shared/analytics/_analytics_web.dart @@ -746,7 +746,7 @@ set flutterClientId(String newFlutterClientId) { _flutterClientId = newFlutterClientId; } -Completer? _computingDimensionsSucceededCompleter; +Completer? _computingDimensionsCompleter; // Computes the running application. void _computeUserApplicationCustomGTagData() { @@ -829,22 +829,19 @@ Future computeFlutterClientId() async { } Future setupDimensions() async { - if (_computingDimensionsSucceededCompleter != null) { - await _computingDimensionsSucceededCompleter!.future; - return; + if (_computingDimensionsCompleter != null) { + return _computingDimensionsCompleter!.future; } - _computingDimensionsSucceededCompleter = Completer(); - bool success = false; + _computingDimensionsCompleter = Completer(); try { computeDevToolsCustomGTagsData(); computeDevToolsQueryParams(); await computeFlutterClientId(); - success = true; } catch (e, st) { _log.warning('Failed to compute dimensions', e, st); } finally { - _computingDimensionsSucceededCompleter!.complete(success); + _computingDimensionsCompleter!.complete(); } }