| # Copyright (c) 2011 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| |
| import os, signal, subprocess |
| from autotest_lib.client.bin import profiler, os_dep |
| from autotest_lib.client.common_lib import error |
| |
| |
| class custom_perf(profiler.profiler): |
| """ |
| This is a profiler class for the perf profiler in ChromeOS. It differs from |
| cros_perf in that you can completely customize what arguments you send in to |
| perf. |
| """ |
| version = 1 |
| |
| def initialize(self, perf_options=''): |
| # The two supported options for profile_type are 'record' and 'stat'. |
| self.perf_options = perf_options |
| self.perf_bin = os_dep.command('perf') |
| |
| |
| def start(self, test): |
| outfile = os.path.join(test.profdir, 'perf.out') |
| |
| cmd = ('cd %s; exec %s %s > %s 2>&1' % |
| (test.profdir, self.perf_bin, self.perf_options, outfile)) |
| |
| self._process = subprocess.Popen(cmd, shell=True, |
| stderr=subprocess.STDOUT) |
| |
| |
| def stop(self, test): |
| ret_code = self._process.poll() |
| if ret_code is not None: |
| raise error.AutotestError('perf terminated early with return code: ' |
| '%d. Please check your logs.' % ret_code) |
| |
| os.killpg(os.getpgid(self._process.pid), signal.SIGINT) |
| self._process.wait() |