Files
sdk/pkg/front_end/tool/perf_event_tool.dart
Paul Berry d810c7d0c0 [front_end] Bump language version to 3.9 and reformat.
This commit was generated by the following steps:

- Manually change the SDK constraint in `pkg/front_end/pubspec.yaml`

- Run `gclient sync`

- Run `find pkg/front_end/benchmarks pkg/front_end/lib
  pkg/front_end/presubmit_helper.dart
  pkg/front_end/presubmit_helper_spawn.dart pkg/front_end/test
  pkg/front_end/tool -iname '*.dart' | xargs
  tools/sdks/dart-sdk/bin/dart format`

- Manually fix remaining long lines and add dead code ignore comments.

- Fix coverage by running `dart --enable-asserts
  pkg/front_end/test/coverage_suite.dart --tasks=5
  --add-and-remove-comments`

- Fix `pkg/front_end/test/coverage_merger/assert_message_auto_ignored`
  by running `dart pkg/front_end/test/unit_test_suites.dart -p
  pkg/front_end/test/coverage_merger/assert_message_auto_ignored
  -DupdateExpectations=true`

The diff is large because the version bump causes the formatter to
switch into "tall mode".

Change-Id: I6a6a696410da8b168060acfe0e4d6e91e294c4f0
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/447628
Auto-Submit: Paul Berry <paulberry@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
2025-08-29 07:31:41 -07:00

77 lines
2.4 KiB
Dart

// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import "dart:io";
const bool debug = false;
/// Tool to find and display any process using perf_events which as a
/// consequence might use one of the hardware counters, leaving fewer for
/// `perf stat` stuff.
/// Likely has to be run as root.
void main() {
try {
mainImpl();
} catch (e) {
print("Got the error '$e'.");
print("");
print("┌───────────────────────────────────────────────────┐");
print("│ Note that this tool likely has to be run as root. │");
print("└───────────────────────────────────────────────────┘");
print("");
rethrow;
}
}
void mainImpl() {
if (!Platform.isLinux) {
throw "This tool only works in Linux.";
}
bool foundSomething = false;
Directory dir = new Directory("/proc/");
for (FileSystemEntity pidDir in dir.listSync(recursive: false)) {
if (pidDir is! Directory) continue;
Uri pidUri = pidDir.uri;
String possiblePid = pidUri.pathSegments[pidUri.pathSegments.length - 2];
int? candidatePid = int.tryParse(possiblePid);
if (candidatePid == null) continue;
Directory fdDir = new Directory.fromUri(pidDir.uri.resolve("fd/"));
int count = 0;
for (FileSystemEntity entry in fdDir.listSync()) {
if (debug) {
print("$entry");
}
if (entry is Link) {
String target = entry.targetSync();
if (debug) {
print(" => target: $target");
}
if (target.contains("perf_event")) {
count++;
}
}
}
if (count > 0) {
print(
"Found $count perf event file descriptors for "
"process with pid $candidatePid:",
);
runPsForPid(candidatePid);
print("");
foundSomething = true;
}
}
if (!foundSomething) {
print("Found no open perf file descriptors.");
return;
}
}
void runPsForPid(int pid) {
ProcessResult psRun = Process.runSync("ps", ["-p", "$pid", "u"]);
stdout.write(psRun.stdout);
stderr.write(psRun.stderr);
}