xref: /openbmc/qemu/scripts/tracetool/backend/__init__.py (revision 93fba1618ddbbef8bedd8d684cf356586c94bbb1)
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
20*93fba161SLluís VilanovaBackend attributes
21*93fba161SLluís Vilanova------------------
22*93fba161SLluís Vilanova
23*93fba161SLluís Vilanova========= ====================================================================
24*93fba161SLluís VilanovaAttribute Description
25*93fba161SLluís Vilanova========= ====================================================================
26*93fba161SLluís VilanovaPUBLIC    If exists and is set to 'True', the backend is considered "public".
27*93fba161SLluís Vilanova========= ====================================================================
28*93fba161SLluís Vilanova
29*93fba161SLluís Vilanova
30650ab98dSLluís VilanovaBackend functions
31650ab98dSLluís Vilanova-----------------
32650ab98dSLluís Vilanova
33650ab98dSLluís Vilanova======== =======================================================================
34650ab98dSLluís VilanovaFunction Description
35650ab98dSLluís Vilanova======== =======================================================================
36650ab98dSLluís Vilanova<format> Called to generate the format- and backend-specific code for each of
37650ab98dSLluís Vilanova         the specified events. If the function does not exist, the backend is
38650ab98dSLluís Vilanova         considered not compatible with the given format.
39650ab98dSLluís Vilanova======== =======================================================================
40650ab98dSLluís Vilanova"""
41650ab98dSLluís Vilanova
42650ab98dSLluís Vilanova__author__     = "Lluís Vilanova <vilanova@ac.upc.edu>"
43650ab98dSLluís Vilanova__copyright__  = "Copyright 2012, Lluís Vilanova <vilanova@ac.upc.edu>"
44650ab98dSLluís Vilanova__license__    = "GPL version 2 or (at your option) any later version"
45650ab98dSLluís Vilanova
46650ab98dSLluís Vilanova__maintainer__ = "Stefan Hajnoczi"
47650ab98dSLluís Vilanova__email__      = "stefanha@linux.vnet.ibm.com"
48650ab98dSLluís Vilanova
49650ab98dSLluís Vilanova
509943e0ecSStefan Hajnocziimport os
51650ab98dSLluís Vilanova
52650ab98dSLluís Vilanovaimport tracetool
53650ab98dSLluís Vilanova
54650ab98dSLluís Vilanova
55*93fba161SLluís Vilanovadef get_list(only_public = False):
56650ab98dSLluís Vilanova    """Get a list of (name, description) pairs."""
57650ab98dSLluís Vilanova    res = [("nop", "Tracing disabled.")]
589943e0ecSStefan Hajnoczi    modnames = []
599943e0ecSStefan Hajnoczi    for filename in os.listdir(tracetool.backend.__path__[0]):
609943e0ecSStefan Hajnoczi        if filename.endswith('.py') and filename != '__init__.py':
619943e0ecSStefan Hajnoczi            modnames.append(filename.rsplit('.', 1)[0])
629943e0ecSStefan Hajnoczi    for modname in modnames:
63650ab98dSLluís Vilanova        module = tracetool.try_import("tracetool.backend." + modname)
64650ab98dSLluís Vilanova
65650ab98dSLluís Vilanova        # just in case; should never fail unless non-module files are put there
66650ab98dSLluís Vilanova        if not module[0]:
67650ab98dSLluís Vilanova            continue
68650ab98dSLluís Vilanova        module = module[1]
69650ab98dSLluís Vilanova
70*93fba161SLluís Vilanova        public = getattr(module, "PUBLIC", False)
71*93fba161SLluís Vilanova        if only_public and not public:
72*93fba161SLluís Vilanova            continue
73*93fba161SLluís Vilanova
74650ab98dSLluís Vilanova        doc = module.__doc__
75650ab98dSLluís Vilanova        if doc is None:
76650ab98dSLluís Vilanova            doc = ""
77650ab98dSLluís Vilanova        doc = doc.strip().split("\n")[0]
78650ab98dSLluís Vilanova
79650ab98dSLluís Vilanova        name = modname.replace("_", "-")
80650ab98dSLluís Vilanova        res.append((name, doc))
81650ab98dSLluís Vilanova    return res
82650ab98dSLluís Vilanova
83650ab98dSLluís Vilanova
84650ab98dSLluís Vilanovadef exists(name):
85650ab98dSLluís Vilanova    """Return whether the given backend exists."""
86650ab98dSLluís Vilanova    if len(name) == 0:
87650ab98dSLluís Vilanova        return False
88650ab98dSLluís Vilanova    if name == "nop":
89650ab98dSLluís Vilanova        return True
90650ab98dSLluís Vilanova    name = name.replace("-", "_")
91650ab98dSLluís Vilanova    return tracetool.try_import("tracetool.backend." + name)[1]
92650ab98dSLluís Vilanova
93650ab98dSLluís Vilanova
94650ab98dSLluís Vilanovadef compatible(backend, format):
95650ab98dSLluís Vilanova    """Whether a backend is compatible with the given format."""
96650ab98dSLluís Vilanova    if not exists(backend):
97650ab98dSLluís Vilanova        raise ValueError("unknown backend: %s" % backend)
98650ab98dSLluís Vilanova
99650ab98dSLluís Vilanova    backend = backend.replace("-", "_")
100650ab98dSLluís Vilanova    format = format.replace("-", "_")
101650ab98dSLluís Vilanova
102650ab98dSLluís Vilanova    if backend == "nop":
103650ab98dSLluís Vilanova        return True
104650ab98dSLluís Vilanova    else:
105650ab98dSLluís Vilanova        func = tracetool.try_import("tracetool.backend." + backend,
106650ab98dSLluís Vilanova                                    format, None)[1]
107650ab98dSLluís Vilanova        return func is not None
108650ab98dSLluís Vilanova
109650ab98dSLluís Vilanova
110650ab98dSLluís Vilanovadef _empty(events):
111650ab98dSLluís Vilanova    pass
112650ab98dSLluís Vilanova
113650ab98dSLluís Vilanovadef generate(backend, format, events):
114650ab98dSLluís Vilanova    """Generate the per-event output for the given (backend, format) pair."""
115650ab98dSLluís Vilanova    if not compatible(backend, format):
116650ab98dSLluís Vilanova        raise ValueError("backend '%s' not compatible with format '%s'" %
117650ab98dSLluís Vilanova                         (backend, format))
118650ab98dSLluís Vilanova
119650ab98dSLluís Vilanova    backend = backend.replace("-", "_")
120650ab98dSLluís Vilanova    format = format.replace("-", "_")
121650ab98dSLluís Vilanova
122650ab98dSLluís Vilanova    if backend == "nop":
123650ab98dSLluís Vilanova        func = tracetool.try_import("tracetool.format." + format,
124650ab98dSLluís Vilanova                                    "nop", _empty)[1]
125650ab98dSLluís Vilanova    else:
126650ab98dSLluís Vilanova        func = tracetool.try_import("tracetool.backend." + backend,
127650ab98dSLluís Vilanova                                    format, None)[1]
128650ab98dSLluís Vilanova
129650ab98dSLluís Vilanova    func(events)
130