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