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 20650ab98dSLluís VilanovaBackend functions 21650ab98dSLluís Vilanova----------------- 22650ab98dSLluís Vilanova 23650ab98dSLluís Vilanova======== ======================================================================= 24650ab98dSLluís VilanovaFunction Description 25650ab98dSLluís Vilanova======== ======================================================================= 26650ab98dSLluís Vilanova<format> Called to generate the format- and backend-specific code for each of 27650ab98dSLluís Vilanova the specified events. If the function does not exist, the backend is 28650ab98dSLluís Vilanova considered not compatible with the given format. 29650ab98dSLluís Vilanova======== ======================================================================= 30650ab98dSLluís Vilanova""" 31650ab98dSLluís Vilanova 32650ab98dSLluís Vilanova__author__ = "Lluís Vilanova <vilanova@ac.upc.edu>" 33650ab98dSLluís Vilanova__copyright__ = "Copyright 2012, Lluís Vilanova <vilanova@ac.upc.edu>" 34650ab98dSLluís Vilanova__license__ = "GPL version 2 or (at your option) any later version" 35650ab98dSLluís Vilanova 36650ab98dSLluís Vilanova__maintainer__ = "Stefan Hajnoczi" 37650ab98dSLluís Vilanova__email__ = "stefanha@linux.vnet.ibm.com" 38650ab98dSLluís Vilanova 39650ab98dSLluís Vilanova 40*9943e0ecSStefan Hajnocziimport os 41650ab98dSLluís Vilanova 42650ab98dSLluís Vilanovaimport tracetool 43650ab98dSLluís Vilanova 44650ab98dSLluís Vilanova 45650ab98dSLluís Vilanovadef get_list(): 46650ab98dSLluís Vilanova """Get a list of (name, description) pairs.""" 47650ab98dSLluís Vilanova res = [("nop", "Tracing disabled.")] 48*9943e0ecSStefan Hajnoczi modnames = [] 49*9943e0ecSStefan Hajnoczi for filename in os.listdir(tracetool.backend.__path__[0]): 50*9943e0ecSStefan Hajnoczi if filename.endswith('.py') and filename != '__init__.py': 51*9943e0ecSStefan Hajnoczi modnames.append(filename.rsplit('.', 1)[0]) 52*9943e0ecSStefan Hajnoczi for modname in modnames: 53650ab98dSLluís Vilanova module = tracetool.try_import("tracetool.backend." + modname) 54650ab98dSLluís Vilanova 55650ab98dSLluís Vilanova # just in case; should never fail unless non-module files are put there 56650ab98dSLluís Vilanova if not module[0]: 57650ab98dSLluís Vilanova continue 58650ab98dSLluís Vilanova module = module[1] 59650ab98dSLluís Vilanova 60650ab98dSLluís Vilanova doc = module.__doc__ 61650ab98dSLluís Vilanova if doc is None: 62650ab98dSLluís Vilanova doc = "" 63650ab98dSLluís Vilanova doc = doc.strip().split("\n")[0] 64650ab98dSLluís Vilanova 65650ab98dSLluís Vilanova name = modname.replace("_", "-") 66650ab98dSLluís Vilanova res.append((name, doc)) 67650ab98dSLluís Vilanova return res 68650ab98dSLluís Vilanova 69650ab98dSLluís Vilanova 70650ab98dSLluís Vilanovadef exists(name): 71650ab98dSLluís Vilanova """Return whether the given backend exists.""" 72650ab98dSLluís Vilanova if len(name) == 0: 73650ab98dSLluís Vilanova return False 74650ab98dSLluís Vilanova if name == "nop": 75650ab98dSLluís Vilanova return True 76650ab98dSLluís Vilanova name = name.replace("-", "_") 77650ab98dSLluís Vilanova return tracetool.try_import("tracetool.backend." + name)[1] 78650ab98dSLluís Vilanova 79650ab98dSLluís Vilanova 80650ab98dSLluís Vilanovadef compatible(backend, format): 81650ab98dSLluís Vilanova """Whether a backend is compatible with the given format.""" 82650ab98dSLluís Vilanova if not exists(backend): 83650ab98dSLluís Vilanova raise ValueError("unknown backend: %s" % backend) 84650ab98dSLluís Vilanova 85650ab98dSLluís Vilanova backend = backend.replace("-", "_") 86650ab98dSLluís Vilanova format = format.replace("-", "_") 87650ab98dSLluís Vilanova 88650ab98dSLluís Vilanova if backend == "nop": 89650ab98dSLluís Vilanova return True 90650ab98dSLluís Vilanova else: 91650ab98dSLluís Vilanova func = tracetool.try_import("tracetool.backend." + backend, 92650ab98dSLluís Vilanova format, None)[1] 93650ab98dSLluís Vilanova return func is not None 94650ab98dSLluís Vilanova 95650ab98dSLluís Vilanova 96650ab98dSLluís Vilanovadef _empty(events): 97650ab98dSLluís Vilanova pass 98650ab98dSLluís Vilanova 99650ab98dSLluís Vilanovadef generate(backend, format, events): 100650ab98dSLluís Vilanova """Generate the per-event output for the given (backend, format) pair.""" 101650ab98dSLluís Vilanova if not compatible(backend, format): 102650ab98dSLluís Vilanova raise ValueError("backend '%s' not compatible with format '%s'" % 103650ab98dSLluís Vilanova (backend, format)) 104650ab98dSLluís Vilanova 105650ab98dSLluís Vilanova backend = backend.replace("-", "_") 106650ab98dSLluís Vilanova format = format.replace("-", "_") 107650ab98dSLluís Vilanova 108650ab98dSLluís Vilanova if backend == "nop": 109650ab98dSLluís Vilanova func = tracetool.try_import("tracetool.format." + format, 110650ab98dSLluís Vilanova "nop", _empty)[1] 111650ab98dSLluís Vilanova else: 112650ab98dSLluís Vilanova func = tracetool.try_import("tracetool.backend." + backend, 113650ab98dSLluís Vilanova format, None)[1] 114650ab98dSLluís Vilanova 115650ab98dSLluís Vilanova func(events) 116