xref: /openbmc/qemu/scripts/tracetool/backend/__init__.py (revision b160d7f84a12a0d67fedf85f465bf24c60fbbc98)
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
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
5593fba161SLluí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])
62*b160d7f8SLluís Vilanova    for modname in sorted(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
7093fba161SLluís Vilanova        public = getattr(module, "PUBLIC", False)
7193fba161SLluís Vilanova        if only_public and not public:
7293fba161SLluís Vilanova            continue
7393fba161SLluí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