You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
3.2 KiB
108 lines
3.2 KiB
import os, sys
|
|
import common
|
|
|
|
from autotest_lib.client.common_lib import error, utils, packages
|
|
|
|
|
|
class ProfilerNotPresentError(error.JobError):
|
|
def __init__(self, name, *args, **dargs):
|
|
msg = "%s not present" % name
|
|
error.JobError.__init__(self, msg, *args, **dargs)
|
|
|
|
|
|
class profiler_manager(object):
|
|
def __init__(self, job):
|
|
self.job = job
|
|
self.list = []
|
|
self.tmpdir = job.tmpdir
|
|
self.profile_run_only = False
|
|
self.active_flag = False
|
|
self.created_dirs = []
|
|
|
|
|
|
def load_profiler(self, profiler, args, dargs):
|
|
""" Given a name and args, loads a profiler, initializes it
|
|
with the required arguments, and returns an instance of it. Raises
|
|
a ProfilerNotPresentError if the module isn't found. """
|
|
raise NotImplementedError("load_profiler not implemented")
|
|
|
|
|
|
def add(self, profiler, *args, **dargs):
|
|
""" Add a profiler """
|
|
new_profiler = self.load_profiler(profiler, args, dargs)
|
|
self.list.append(new_profiler)
|
|
|
|
|
|
def delete(self, profiler):
|
|
""" Remove a profiler """
|
|
self.list = [p for p in self.list if p.name != profiler]
|
|
|
|
|
|
def current_profilers(self):
|
|
""" Returns a set of the currently enabled profilers """
|
|
return set(p.name for p in self.list)
|
|
|
|
|
|
def present(self):
|
|
""" Indicates if any profilers are enabled """
|
|
return len(self.list) > 0
|
|
|
|
|
|
def only(self):
|
|
""" Returns True if job is supposed to be run only with profiling
|
|
turned on, False otherwise """
|
|
return self.profile_run_only
|
|
|
|
|
|
def set_only(self, value):
|
|
""" Changes the flag which determines whether or not the job is to be
|
|
run without profilers at all """
|
|
self.profile_run_only = value
|
|
|
|
|
|
def before_start(self, test):
|
|
"""
|
|
Override to do any setup needed before actually starting the profilers
|
|
(this function is called before calling test.before_run_once() and
|
|
profilers.start() in a profiled run).
|
|
"""
|
|
pass
|
|
|
|
|
|
def start(self, test):
|
|
""" Start all enabled profilers """
|
|
for p in self.list:
|
|
p.start(test)
|
|
self.active_flag = True
|
|
|
|
|
|
def stop(self, test):
|
|
""" Stop all enabled profilers """
|
|
for p in self.list:
|
|
p.stop(test)
|
|
self.active_flag = False
|
|
|
|
|
|
def active(self):
|
|
""" Returns True if profilers are present and started, False
|
|
otherwise """
|
|
return self.present() and self.active_flag
|
|
|
|
|
|
def report(self, test):
|
|
""" Report on all enabled profilers """
|
|
for p in self.list:
|
|
p.report(test)
|
|
|
|
if getattr(test, 'iteration', None):
|
|
name = 'iteration.%s' % test.iteration
|
|
iter_path = os.path.join(test.profdir, name)
|
|
os.system('mkdir -p %s' % iter_path)
|
|
self.created_dirs.append(name)
|
|
for file in os.listdir(test.profdir):
|
|
if file in self.created_dirs:
|
|
continue
|
|
file_path = os.path.join(test.profdir, file)
|
|
iter_path_file = os.path.join(iter_path, file)
|
|
os.rename(file_path, iter_path_file)
|