xref: /openbmc/qemu/scripts/tracetool/backend/__init__.py (revision 5b808275f3bbe8cc95bb9301f4d5a41331d0e0e6)
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
331dad2ce9SLluís VilanovaAll the following functions are optional, and no output will be generated if
341dad2ce9SLluís Vilanovathey do not exist.
351dad2ce9SLluís Vilanova
361dad2ce9SLluís Vilanova=============================== ==============================================
37650ab98dSLluís VilanovaFunction                        Description
381dad2ce9SLluís Vilanova=============================== ==============================================
391dad2ce9SLluís Vilanovagenerate_<format>_begin(events) Generate backend- and format-specific file
401dad2ce9SLluís Vilanova                                header contents.
411dad2ce9SLluís Vilanovagenerate_<format>_end(events)   Generate backend- and format-specific file
421dad2ce9SLluís Vilanova                                footer contents.
431dad2ce9SLluís Vilanovagenerate_<format>(event)        Generate backend- and format-specific contents
441dad2ce9SLluís Vilanova                                for the given event.
451dad2ce9SLluís Vilanova=============================== ==============================================
461dad2ce9SLluís Vilanova
47650ab98dSLluís Vilanova"""
48650ab98dSLluís Vilanova
49650ab98dSLluís Vilanova__author__     = "Lluís Vilanova <vilanova@ac.upc.edu>"
501dad2ce9SLluí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
1011dad2ce9SLluís Vilanovaclass Wrapper:
102*5b808275SLluís Vilanova    def __init__(self, backends, format):
103*5b808275SLluís Vilanova        self._backends = [backend.replace("-", "_") for backend in backends]
1041dad2ce9SLluís Vilanova        self._format = format.replace("-", "_")
105*5b808275SLluís Vilanova        assert all(exists(backend) for backend in self._backends)
1061dad2ce9SLluís Vilanova        assert tracetool.format.exists(self._format)
107650ab98dSLluís Vilanova
1081dad2ce9SLluís Vilanova    def _run_function(self, name, *args, **kwargs):
109*5b808275SLluís Vilanova        for backend in self._backends:
110*5b808275SLluís Vilanova            func = tracetool.try_import("tracetool.backend." + backend,
1111dad2ce9SLluís Vilanova                                        name % self._format, None)[1]
1121dad2ce9SLluís Vilanova            if func is not None:
1131dad2ce9SLluís Vilanova                func(*args, **kwargs)
114650ab98dSLluís Vilanova
1151dad2ce9SLluís Vilanova    def generate_begin(self, events):
1161dad2ce9SLluís Vilanova        self._run_function("generate_%s_begin", events)
117650ab98dSLluís Vilanova
1181dad2ce9SLluís Vilanova    def generate(self, event):
1191dad2ce9SLluís Vilanova        self._run_function("generate_%s", event)
120650ab98dSLluís Vilanova
1211dad2ce9SLluís Vilanova    def generate_end(self, events):
1221dad2ce9SLluís Vilanova        self._run_function("generate_%s_end", events)
123