1*650ab98dSLluís Vilanova#!/usr/bin/env python 2*650ab98dSLluís Vilanova# -*- coding: utf-8 -*- 3*650ab98dSLluís Vilanova 4*650ab98dSLluís Vilanova""" 5*650ab98dSLluís VilanovaBackend management. 6*650ab98dSLluís Vilanova 7*650ab98dSLluís Vilanova 8*650ab98dSLluís VilanovaCreating new backends 9*650ab98dSLluís Vilanova--------------------- 10*650ab98dSLluís Vilanova 11*650ab98dSLluís VilanovaA new backend named 'foo-bar' corresponds to Python module 12*650ab98dSLluís Vilanova'tracetool/backend/foo_bar.py'. 13*650ab98dSLluís Vilanova 14*650ab98dSLluís VilanovaA backend module should provide a docstring, whose first non-empty line will be 15*650ab98dSLluís Vilanovaconsidered its short description. 16*650ab98dSLluís Vilanova 17*650ab98dSLluís VilanovaAll backends must generate their contents through the 'tracetool.out' routine. 18*650ab98dSLluís Vilanova 19*650ab98dSLluís Vilanova 20*650ab98dSLluís VilanovaBackend functions 21*650ab98dSLluís Vilanova----------------- 22*650ab98dSLluís Vilanova 23*650ab98dSLluís Vilanova======== ======================================================================= 24*650ab98dSLluís VilanovaFunction Description 25*650ab98dSLluís Vilanova======== ======================================================================= 26*650ab98dSLluís Vilanova<format> Called to generate the format- and backend-specific code for each of 27*650ab98dSLluís Vilanova the specified events. If the function does not exist, the backend is 28*650ab98dSLluís Vilanova considered not compatible with the given format. 29*650ab98dSLluís Vilanova======== ======================================================================= 30*650ab98dSLluís Vilanova""" 31*650ab98dSLluís Vilanova 32*650ab98dSLluís Vilanova__author__ = "Lluís Vilanova <vilanova@ac.upc.edu>" 33*650ab98dSLluís Vilanova__copyright__ = "Copyright 2012, Lluís Vilanova <vilanova@ac.upc.edu>" 34*650ab98dSLluís Vilanova__license__ = "GPL version 2 or (at your option) any later version" 35*650ab98dSLluís Vilanova 36*650ab98dSLluís Vilanova__maintainer__ = "Stefan Hajnoczi" 37*650ab98dSLluís Vilanova__email__ = "stefanha@linux.vnet.ibm.com" 38*650ab98dSLluís Vilanova 39*650ab98dSLluís Vilanova 40*650ab98dSLluís Vilanovaimport pkgutil 41*650ab98dSLluís Vilanova 42*650ab98dSLluís Vilanovaimport tracetool 43*650ab98dSLluís Vilanova 44*650ab98dSLluís Vilanova 45*650ab98dSLluís Vilanovadef get_list(): 46*650ab98dSLluís Vilanova """Get a list of (name, description) pairs.""" 47*650ab98dSLluís Vilanova res = [("nop", "Tracing disabled.")] 48*650ab98dSLluís Vilanova for _, modname, _ in pkgutil.iter_modules(tracetool.backend.__path__): 49*650ab98dSLluís Vilanova module = tracetool.try_import("tracetool.backend." + modname) 50*650ab98dSLluís Vilanova 51*650ab98dSLluís Vilanova # just in case; should never fail unless non-module files are put there 52*650ab98dSLluís Vilanova if not module[0]: 53*650ab98dSLluís Vilanova continue 54*650ab98dSLluís Vilanova module = module[1] 55*650ab98dSLluís Vilanova 56*650ab98dSLluís Vilanova doc = module.__doc__ 57*650ab98dSLluís Vilanova if doc is None: 58*650ab98dSLluís Vilanova doc = "" 59*650ab98dSLluís Vilanova doc = doc.strip().split("\n")[0] 60*650ab98dSLluís Vilanova 61*650ab98dSLluís Vilanova name = modname.replace("_", "-") 62*650ab98dSLluís Vilanova res.append((name, doc)) 63*650ab98dSLluís Vilanova return res 64*650ab98dSLluís Vilanova 65*650ab98dSLluís Vilanova 66*650ab98dSLluís Vilanovadef exists(name): 67*650ab98dSLluís Vilanova """Return whether the given backend exists.""" 68*650ab98dSLluís Vilanova if len(name) == 0: 69*650ab98dSLluís Vilanova return False 70*650ab98dSLluís Vilanova if name == "nop": 71*650ab98dSLluís Vilanova return True 72*650ab98dSLluís Vilanova name = name.replace("-", "_") 73*650ab98dSLluís Vilanova return tracetool.try_import("tracetool.backend." + name)[1] 74*650ab98dSLluís Vilanova 75*650ab98dSLluís Vilanova 76*650ab98dSLluís Vilanovadef compatible(backend, format): 77*650ab98dSLluís Vilanova """Whether a backend is compatible with the given format.""" 78*650ab98dSLluís Vilanova if not exists(backend): 79*650ab98dSLluís Vilanova raise ValueError("unknown backend: %s" % backend) 80*650ab98dSLluís Vilanova 81*650ab98dSLluís Vilanova backend = backend.replace("-", "_") 82*650ab98dSLluís Vilanova format = format.replace("-", "_") 83*650ab98dSLluís Vilanova 84*650ab98dSLluís Vilanova if backend == "nop": 85*650ab98dSLluís Vilanova return True 86*650ab98dSLluís Vilanova else: 87*650ab98dSLluís Vilanova func = tracetool.try_import("tracetool.backend." + backend, 88*650ab98dSLluís Vilanova format, None)[1] 89*650ab98dSLluís Vilanova return func is not None 90*650ab98dSLluís Vilanova 91*650ab98dSLluís Vilanova 92*650ab98dSLluís Vilanovadef _empty(events): 93*650ab98dSLluís Vilanova pass 94*650ab98dSLluís Vilanova 95*650ab98dSLluís Vilanovadef generate(backend, format, events): 96*650ab98dSLluís Vilanova """Generate the per-event output for the given (backend, format) pair.""" 97*650ab98dSLluís Vilanova if not compatible(backend, format): 98*650ab98dSLluís Vilanova raise ValueError("backend '%s' not compatible with format '%s'" % 99*650ab98dSLluís Vilanova (backend, format)) 100*650ab98dSLluís Vilanova 101*650ab98dSLluís Vilanova backend = backend.replace("-", "_") 102*650ab98dSLluís Vilanova format = format.replace("-", "_") 103*650ab98dSLluís Vilanova 104*650ab98dSLluís Vilanova if backend == "nop": 105*650ab98dSLluís Vilanova func = tracetool.try_import("tracetool.format." + format, 106*650ab98dSLluís Vilanova "nop", _empty)[1] 107*650ab98dSLluís Vilanova else: 108*650ab98dSLluís Vilanova func = tracetool.try_import("tracetool.backend." + backend, 109*650ab98dSLluís Vilanova format, None)[1] 110*650ab98dSLluís Vilanova 111*650ab98dSLluís Vilanova func(events) 112