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