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)