xref: /openbmc/qemu/scripts/tracetool/backend/__init__.py (revision 1dad2ce97345f3424c4990cb232b40a35d5e936b)
1650ab98dSLluís Vilanova#!/usr/bin/env python
2650ab98dSLluís Vilanova# -*- coding: utf-8 -*-
3650ab98dSLluís Vilanova
4650ab98dSLluís Vilanova"""
5650ab98dSLluís VilanovaBackend management.
6650ab98dSLluís Vilanova
7650ab98dSLluís Vilanova
8650ab98dSLluís VilanovaCreating new backends
9650ab98dSLluís Vilanova---------------------
10650ab98dSLluís Vilanova
11650ab98dSLluís VilanovaA new backend named 'foo-bar' corresponds to Python module
12650ab98dSLluís Vilanova'tracetool/backend/foo_bar.py'.
13650ab98dSLluís Vilanova
14650ab98dSLluís VilanovaA backend module should provide a docstring, whose first non-empty line will be
15650ab98dSLluís Vilanovaconsidered its short description.
16650ab98dSLluís Vilanova
17650ab98dSLluís VilanovaAll backends must generate their contents through the 'tracetool.out' routine.
18650ab98dSLluís Vilanova
19650ab98dSLluís Vilanova
2093fba161SLluís VilanovaBackend attributes
2193fba161SLluís Vilanova------------------
2293fba161SLluís Vilanova
2393fba161SLluís Vilanova========= ====================================================================
2493fba161SLluís VilanovaAttribute Description
2593fba161SLluís Vilanova========= ====================================================================
2693fba161SLluís VilanovaPUBLIC    If exists and is set to 'True', the backend is considered "public".
2793fba161SLluís Vilanova========= ====================================================================
2893fba161SLluís Vilanova
2993fba161SLluís Vilanova
30650ab98dSLluís VilanovaBackend functions
31650ab98dSLluís Vilanova-----------------
32650ab98dSLluís Vilanova
33*1dad2ce9SLluís VilanovaAll the following functions are optional, and no output will be generated if
34*1dad2ce9SLluís Vilanovathey do not exist.
35*1dad2ce9SLluís Vilanova
36*1dad2ce9SLluís Vilanova=============================== ==============================================
37650ab98dSLluís VilanovaFunction                        Description
38*1dad2ce9SLluís Vilanova=============================== ==============================================
39*1dad2ce9SLluís Vilanovagenerate_<format>_begin(events) Generate backend- and format-specific file
40*1dad2ce9SLluís Vilanova                                header contents.
41*1dad2ce9SLluís Vilanovagenerate_<format>_end(events)   Generate backend- and format-specific file
42*1dad2ce9SLluís Vilanova                                footer contents.
43*1dad2ce9SLluís Vilanovagenerate_<format>(event)        Generate backend- and format-specific contents
44*1dad2ce9SLluís Vilanova                                for the given event.
45*1dad2ce9SLluís Vilanova=============================== ==============================================
46*1dad2ce9SLluís Vilanova
47650ab98dSLluís Vilanova"""
48650ab98dSLluís Vilanova
49650ab98dSLluís Vilanova__author__     = "Lluís Vilanova <vilanova@ac.upc.edu>"
50*1dad2ce9SLluís Vilanova__copyright__  = "Copyright 2012-2014, Lluís Vilanova <vilanova@ac.upc.edu>"
51650ab98dSLluís Vilanova__license__    = "GPL version 2 or (at your option) any later version"
52650ab98dSLluís Vilanova
53650ab98dSLluís Vilanova__maintainer__ = "Stefan Hajnoczi"
54650ab98dSLluís Vilanova__email__      = "stefanha@linux.vnet.ibm.com"
55650ab98dSLluís Vilanova
56650ab98dSLluís Vilanova
579943e0ecSStefan Hajnocziimport os
58650ab98dSLluís Vilanova
59650ab98dSLluís Vilanovaimport tracetool
60650ab98dSLluís Vilanova
61650ab98dSLluís Vilanova
6293fba161SLluís Vilanovadef get_list(only_public = False):
63650ab98dSLluís Vilanova    """Get a list of (name, description) pairs."""
64650ab98dSLluís Vilanova    res = [("nop", "Tracing disabled.")]
659943e0ecSStefan Hajnoczi    modnames = []
669943e0ecSStefan Hajnoczi    for filename in os.listdir(tracetool.backend.__path__[0]):
679943e0ecSStefan Hajnoczi        if filename.endswith('.py') and filename != '__init__.py':
689943e0ecSStefan Hajnoczi            modnames.append(filename.rsplit('.', 1)[0])
69b160d7f8SLluís Vilanova    for modname in sorted(modnames):
70650ab98dSLluís Vilanova        module = tracetool.try_import("tracetool.backend." + modname)
71650ab98dSLluís Vilanova
72650ab98dSLluís Vilanova        # just in case; should never fail unless non-module files are put there
73650ab98dSLluís Vilanova        if not module[0]:
74650ab98dSLluís Vilanova            continue
75650ab98dSLluís Vilanova        module = module[1]
76650ab98dSLluís Vilanova
7793fba161SLluís Vilanova        public = getattr(module, "PUBLIC", False)
7893fba161SLluís Vilanova        if only_public and not public:
7993fba161SLluís Vilanova            continue
8093fba161SLluís Vilanova
81650ab98dSLluís Vilanova        doc = module.__doc__
82650ab98dSLluís Vilanova        if doc is None:
83650ab98dSLluís Vilanova            doc = ""
84650ab98dSLluís Vilanova        doc = doc.strip().split("\n")[0]
85650ab98dSLluís Vilanova
86650ab98dSLluís Vilanova        name = modname.replace("_", "-")
87650ab98dSLluís Vilanova        res.append((name, doc))
88650ab98dSLluís Vilanova    return res
89650ab98dSLluís Vilanova
90650ab98dSLluís Vilanova
91650ab98dSLluís Vilanovadef exists(name):
92650ab98dSLluís Vilanova    """Return whether the given backend exists."""
93650ab98dSLluís Vilanova    if len(name) == 0:
94650ab98dSLluís Vilanova        return False
95650ab98dSLluís Vilanova    if name == "nop":
96650ab98dSLluís Vilanova        return True
97650ab98dSLluís Vilanova    name = name.replace("-", "_")
98650ab98dSLluís Vilanova    return tracetool.try_import("tracetool.backend." + name)[1]
99650ab98dSLluís Vilanova
100650ab98dSLluís Vilanova
101*1dad2ce9SLluís Vilanovaclass Wrapper:
102*1dad2ce9SLluís Vilanova    def __init__(self, backend, format):
103*1dad2ce9SLluís Vilanova        self._backend = backend.replace("-", "_")
104*1dad2ce9SLluís Vilanova        self._format = format.replace("-", "_")
105*1dad2ce9SLluís Vilanova        assert exists(self._backend)
106*1dad2ce9SLluís Vilanova        assert tracetool.format.exists(self._format)
107650ab98dSLluís Vilanova
108*1dad2ce9SLluís Vilanova    def _run_function(self, name, *args, **kwargs):
109*1dad2ce9SLluís Vilanova        func = tracetool.try_import("tracetool.backend." + self._backend,
110*1dad2ce9SLluís Vilanova                                    name % self._format, None)[1]
111*1dad2ce9SLluís Vilanova        if func is not None:
112*1dad2ce9SLluís Vilanova            func(*args, **kwargs)
113650ab98dSLluís Vilanova
114*1dad2ce9SLluís Vilanova    def generate_begin(self, events):
115*1dad2ce9SLluís Vilanova        self._run_function("generate_%s_begin", events)
116650ab98dSLluís Vilanova
117*1dad2ce9SLluís Vilanova    def generate(self, event):
118*1dad2ce9SLluís Vilanova        self._run_function("generate_%s", event)
119650ab98dSLluís Vilanova
120*1dad2ce9SLluís Vilanova    def generate_end(self, events):
121*1dad2ce9SLluís Vilanova        self._run_function("generate_%s_end", events)
122