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)