1import os
2import re
3from autotest_lib.client.bin import test
4from autotest_lib.client.bin import utils
5
6import tracers
7import base_tracer
8
9class tracing_microbenchmark(test.test):
10    version = 1
11    preserve_srcdir = True
12
13    def setup(self):
14        os.chdir(self.srcdir)
15        utils.system('make CROSS_COMPILE=""')
16
17    def initialize(self, tracer='ftrace', calls=100000, **kwargs):
18        self.job.require_gcc()
19        tracer_class = getattr(tracers, tracer)
20        if not issubclass(tracer_class, base_tracer.Tracer):
21            raise TypeError
22        self.tracer = tracer_class()
23
24        getuid_microbench = os.path.join(self.srcdir, 'getuid_microbench')
25        self.cmd = '%s %d' % (getuid_microbench, calls)
26
27    def warmup(self, buffer_size_kb=8000, **kwargs):
28        self.tracer.warmup(buffer_size_kb)
29
30    def cleanup(self):
31        self.tracer.cleanup()
32
33    def run_once(self, **kwargs):
34        self.results = {}
35
36        self.tracer.start_tracing()
37        self.cmd_result = utils.run(self.cmd)
38        self.tracer.stop_tracing()
39
40        self.tracer.gather_stats(self.results)
41        self.tracer.reset_tracing()
42
43    def postprocess_iteration(self):
44        result_re = re.compile(r'(?P<calls>\d+) calls '
45                               r'in (?P<time>\d+\.\d+) s '
46                               '\((?P<ns_per_call>\d+\.\d+) ns/call\)')
47        match = result_re.match(self.cmd_result.stdout)
48        self.results.update(match.groupdict())
49
50        self.write_perf_keyval(self.results)
51