Index: tools/telemetry/telemetry/core/platform/profiler/perf_profiler.py |
diff --git a/tools/telemetry/telemetry/core/platform/profiler/perf_profiler.py b/tools/telemetry/telemetry/core/platform/profiler/perf_profiler.py |
index eb737440ff015776059472581235a58f18502f8e..18074f28e34a661f229360ea8d6c73b9eb1291d3 100644 |
--- a/tools/telemetry/telemetry/core/platform/profiler/perf_profiler.py |
+++ b/tools/telemetry/telemetry/core/platform/profiler/perf_profiler.py |
@@ -10,34 +10,16 @@ import tempfile |
from telemetry.core.platform import profiler |
-class PerfProfiler(profiler.Profiler): |
- |
- def __init__(self, browser_backend, pid, output_path): |
- super(PerfProfiler, self).__init__(output_path) |
- self._browser_backend = browser_backend |
+class _SingleProcessPerfProfiler(object): |
+ """An internal class for using perf for a given process.""" |
+ def __init__(self, pid, output_file): |
+ self._output_file = output_file |
self._tmp_output_file = tempfile.NamedTemporaryFile('w', 0) |
self._proc = subprocess.Popen( |
['perf', 'record', '--call-graph', |
- '--pid', str(pid), '--output', self.output_path], |
+ '--pid', str(pid), '--output', output_file], |
stdout=self._tmp_output_file, stderr=subprocess.STDOUT) |
- @classmethod |
- def name(cls): |
- return 'perf' |
- |
- @classmethod |
- def is_supported(cls, options): |
- if (sys.platform != 'linux2' |
- or options.browser_type.startswith('android') |
- or options.browser_type.startswith('cros')): |
- return False |
- try: |
- return not subprocess.Popen(['perf', '--version'], |
- stderr=subprocess.STDOUT, |
- stdout=subprocess.PIPE).wait() |
- except OSError: |
- return False |
- |
def CollectProfile(self): |
self._proc.send_signal(signal.SIGINT) |
exit_code = self._proc.wait() |
@@ -47,11 +29,9 @@ class PerfProfiler(profiler.Profiler): |
'perf failed with exit code %d. Output:\n%s' % (exit_code, |
self._GetStdOut())) |
finally: |
- self._proc = None |
self._tmp_output_file.close() |
- |
print 'To view the profile, run:' |
- print ' perf report -i %s' % self.output_path |
+ print ' perf report -i %s' % self._output_file |
def _GetStdOut(self): |
self._tmp_output_file.flush() |
@@ -60,3 +40,36 @@ class PerfProfiler(profiler.Profiler): |
return f.read() |
except IOError: |
return '' |
+ |
+ |
+class PerfProfiler(profiler.Profiler): |
+ |
+ def __init__(self, browser_backend, platform_backend, output_path): |
+ super(PerfProfiler, self).__init__( |
+ browser_backend, platform_backend, output_path) |
+ process_output_file_map = self._GetProcessOutputFileMap() |
+ self._process_profilers = [] |
+ for pid, output_file in process_output_file_map.iteritems(): |
+ self._process_profilers.append( |
+ _SingleProcessPerfProfiler(pid, output_file)) |
+ |
+ @classmethod |
+ def name(cls): |
+ return 'perf' |
+ |
+ @classmethod |
+ def is_supported(cls, options): |
+ if (sys.platform != 'linux2' |
+ or options.browser_type.startswith('android') |
+ or options.browser_type.startswith('cros')): |
+ return False |
+ try: |
+ return not subprocess.Popen(['perf', '--version'], |
+ stderr=subprocess.STDOUT, |
+ stdout=subprocess.PIPE).wait() |
+ except OSError: |
+ return False |
+ |
+ def CollectProfile(self): |
+ for single_process in self._process_profilers: |
+ single_process.CollectProfile() |