xref: /aosp_15_r20/external/autotest/client/common_lib/profiler_manager.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
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