1*9c5db199SXin Liimport os, sys 2*9c5db199SXin Liimport common 3*9c5db199SXin Li 4*9c5db199SXin Lifrom autotest_lib.client.common_lib import error, utils, packages 5*9c5db199SXin Li 6*9c5db199SXin Li 7*9c5db199SXin Liclass ProfilerNotPresentError(error.JobError): 8*9c5db199SXin Li def __init__(self, name, *args, **dargs): 9*9c5db199SXin Li msg = "%s not present" % name 10*9c5db199SXin Li error.JobError.__init__(self, msg, *args, **dargs) 11*9c5db199SXin Li 12*9c5db199SXin Li 13*9c5db199SXin Liclass profiler_manager(object): 14*9c5db199SXin Li def __init__(self, job): 15*9c5db199SXin Li self.job = job 16*9c5db199SXin Li self.list = [] 17*9c5db199SXin Li self.tmpdir = job.tmpdir 18*9c5db199SXin Li self.profile_run_only = False 19*9c5db199SXin Li self.active_flag = False 20*9c5db199SXin Li self.created_dirs = [] 21*9c5db199SXin Li 22*9c5db199SXin Li 23*9c5db199SXin Li def load_profiler(self, profiler, args, dargs): 24*9c5db199SXin Li """ Given a name and args, loads a profiler, initializes it 25*9c5db199SXin Li with the required arguments, and returns an instance of it. Raises 26*9c5db199SXin Li a ProfilerNotPresentError if the module isn't found. """ 27*9c5db199SXin Li raise NotImplementedError("load_profiler not implemented") 28*9c5db199SXin Li 29*9c5db199SXin Li 30*9c5db199SXin Li def add(self, profiler, *args, **dargs): 31*9c5db199SXin Li """ Add a profiler """ 32*9c5db199SXin Li new_profiler = self.load_profiler(profiler, args, dargs) 33*9c5db199SXin Li self.list.append(new_profiler) 34*9c5db199SXin Li 35*9c5db199SXin Li 36*9c5db199SXin Li def delete(self, profiler): 37*9c5db199SXin Li """ Remove a profiler """ 38*9c5db199SXin Li self.list = [p for p in self.list if p.name != profiler] 39*9c5db199SXin Li 40*9c5db199SXin Li 41*9c5db199SXin Li def current_profilers(self): 42*9c5db199SXin Li """ Returns a set of the currently enabled profilers """ 43*9c5db199SXin Li return set(p.name for p in self.list) 44*9c5db199SXin Li 45*9c5db199SXin Li 46*9c5db199SXin Li def present(self): 47*9c5db199SXin Li """ Indicates if any profilers are enabled """ 48*9c5db199SXin Li return len(self.list) > 0 49*9c5db199SXin Li 50*9c5db199SXin Li 51*9c5db199SXin Li def only(self): 52*9c5db199SXin Li """ Returns True if job is supposed to be run only with profiling 53*9c5db199SXin Li turned on, False otherwise """ 54*9c5db199SXin Li return self.profile_run_only 55*9c5db199SXin Li 56*9c5db199SXin Li 57*9c5db199SXin Li def set_only(self, value): 58*9c5db199SXin Li """ Changes the flag which determines whether or not the job is to be 59*9c5db199SXin Li run without profilers at all """ 60*9c5db199SXin Li self.profile_run_only = value 61*9c5db199SXin Li 62*9c5db199SXin Li 63*9c5db199SXin Li def before_start(self, test): 64*9c5db199SXin Li """ 65*9c5db199SXin Li Override to do any setup needed before actually starting the profilers 66*9c5db199SXin Li (this function is called before calling test.before_run_once() and 67*9c5db199SXin Li profilers.start() in a profiled run). 68*9c5db199SXin Li """ 69*9c5db199SXin Li pass 70*9c5db199SXin Li 71*9c5db199SXin Li 72*9c5db199SXin Li def start(self, test): 73*9c5db199SXin Li """ Start all enabled profilers """ 74*9c5db199SXin Li for p in self.list: 75*9c5db199SXin Li p.start(test) 76*9c5db199SXin Li self.active_flag = True 77*9c5db199SXin Li 78*9c5db199SXin Li 79*9c5db199SXin Li def stop(self, test): 80*9c5db199SXin Li """ Stop all enabled profilers """ 81*9c5db199SXin Li for p in self.list: 82*9c5db199SXin Li p.stop(test) 83*9c5db199SXin Li self.active_flag = False 84*9c5db199SXin Li 85*9c5db199SXin Li 86*9c5db199SXin Li def active(self): 87*9c5db199SXin Li """ Returns True if profilers are present and started, False 88*9c5db199SXin Li otherwise """ 89*9c5db199SXin Li return self.present() and self.active_flag 90*9c5db199SXin Li 91*9c5db199SXin Li 92*9c5db199SXin Li def report(self, test): 93*9c5db199SXin Li """ Report on all enabled profilers """ 94*9c5db199SXin Li for p in self.list: 95*9c5db199SXin Li p.report(test) 96*9c5db199SXin Li 97*9c5db199SXin Li if getattr(test, 'iteration', None): 98*9c5db199SXin Li name = 'iteration.%s' % test.iteration 99*9c5db199SXin Li iter_path = os.path.join(test.profdir, name) 100*9c5db199SXin Li os.system('mkdir -p %s' % iter_path) 101*9c5db199SXin Li self.created_dirs.append(name) 102*9c5db199SXin Li for file in os.listdir(test.profdir): 103*9c5db199SXin Li if file in self.created_dirs: 104*9c5db199SXin Li continue 105*9c5db199SXin Li file_path = os.path.join(test.profdir, file) 106*9c5db199SXin Li iter_path_file = os.path.join(iter_path, file) 107*9c5db199SXin Li os.rename(file_path, iter_path_file) 108