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 331dad2ce9SLluís VilanovaAll the following functions are optional, and no output will be generated if 341dad2ce9SLluís Vilanovathey do not exist. 351dad2ce9SLluís Vilanova 361dad2ce9SLluís Vilanova=============================== ============================================== 37650ab98dSLluís VilanovaFunction Description 381dad2ce9SLluís Vilanova=============================== ============================================== 391dad2ce9SLluís Vilanovagenerate_<format>_begin(events) Generate backend- and format-specific file 401dad2ce9SLluís Vilanova header contents. 411dad2ce9SLluís Vilanovagenerate_<format>_end(events) Generate backend- and format-specific file 421dad2ce9SLluís Vilanova footer contents. 431dad2ce9SLluís Vilanovagenerate_<format>(event) Generate backend- and format-specific contents 441dad2ce9SLluís Vilanova for the given event. 451dad2ce9SLluís Vilanova=============================== ============================================== 461dad2ce9SLluís Vilanova 47650ab98dSLluís Vilanova""" 48650ab98dSLluís Vilanova 49650ab98dSLluís Vilanova__author__ = "Lluís Vilanova <vilanova@ac.upc.edu>" 501dad2ce9SLluís Vilanova__copyright__ = "Copyright 2012-2014, Lluís Vilanova <vilanova@ac.upc.edu>" 51650ab98dSLluís Vilanova__license__ = "GPL version 2 or (at your option) any later version" 52650ab98dSLluís Vilanova 53650ab98dSLluís Vilanova__maintainer__ = "Stefan Hajnoczi" 54650ab98dSLluís Vilanova__email__ = "stefanha@linux.vnet.ibm.com" 55650ab98dSLluís Vilanova 56650ab98dSLluís Vilanova 579943e0ecSStefan Hajnocziimport os 58650ab98dSLluís Vilanova 59650ab98dSLluís Vilanovaimport tracetool 60650ab98dSLluís Vilanova 61650ab98dSLluís Vilanova 6293fba161SLluís Vilanovadef get_list(only_public = False): 63650ab98dSLluís Vilanova """Get a list of (name, description) pairs.""" 64650ab98dSLluís Vilanova res = [("nop", "Tracing disabled.")] 659943e0ecSStefan Hajnoczi modnames = [] 669943e0ecSStefan Hajnoczi for filename in os.listdir(tracetool.backend.__path__[0]): 679943e0ecSStefan Hajnoczi if filename.endswith('.py') and filename != '__init__.py': 689943e0ecSStefan Hajnoczi modnames.append(filename.rsplit('.', 1)[0]) 69b160d7f8SLluís Vilanova for modname in sorted(modnames): 70650ab98dSLluís Vilanova module = tracetool.try_import("tracetool.backend." + modname) 71650ab98dSLluís Vilanova 72650ab98dSLluís Vilanova # just in case; should never fail unless non-module files are put there 73650ab98dSLluís Vilanova if not module[0]: 74650ab98dSLluís Vilanova continue 75650ab98dSLluís Vilanova module = module[1] 76650ab98dSLluís Vilanova 7793fba161SLluís Vilanova public = getattr(module, "PUBLIC", False) 7893fba161SLluís Vilanova if only_public and not public: 7993fba161SLluís Vilanova continue 8093fba161SLluís Vilanova 81650ab98dSLluís Vilanova doc = module.__doc__ 82650ab98dSLluís Vilanova if doc is None: 83650ab98dSLluís Vilanova doc = "" 84650ab98dSLluís Vilanova doc = doc.strip().split("\n")[0] 85650ab98dSLluís Vilanova 86650ab98dSLluís Vilanova name = modname.replace("_", "-") 87650ab98dSLluís Vilanova res.append((name, doc)) 88650ab98dSLluís Vilanova return res 89650ab98dSLluís Vilanova 90650ab98dSLluís Vilanova 91650ab98dSLluís Vilanovadef exists(name): 92650ab98dSLluís Vilanova """Return whether the given backend exists.""" 93650ab98dSLluís Vilanova if len(name) == 0: 94650ab98dSLluís Vilanova return False 95650ab98dSLluís Vilanova if name == "nop": 96650ab98dSLluís Vilanova return True 97650ab98dSLluís Vilanova name = name.replace("-", "_") 98650ab98dSLluís Vilanova return tracetool.try_import("tracetool.backend." + name)[1] 99650ab98dSLluís Vilanova 100650ab98dSLluís Vilanova 1011dad2ce9SLluís Vilanovaclass Wrapper: 1025b808275SLluís Vilanova def __init__(self, backends, format): 1035b808275SLluís Vilanova self._backends = [backend.replace("-", "_") for backend in backends] 1041dad2ce9SLluís Vilanova self._format = format.replace("-", "_") 10573735f72SStefan Hajnoczi for backend in self._backends: 10673735f72SStefan Hajnoczi assert exists(backend) 1071dad2ce9SLluís Vilanova assert tracetool.format.exists(self._format) 108650ab98dSLluís Vilanova 1091dad2ce9SLluís Vilanova def _run_function(self, name, *args, **kwargs): 1105b808275SLluís Vilanova for backend in self._backends: 1115b808275SLluís Vilanova func = tracetool.try_import("tracetool.backend." + backend, 1121dad2ce9SLluís Vilanova name % self._format, None)[1] 1131dad2ce9SLluís Vilanova if func is not None: 1141dad2ce9SLluís Vilanova func(*args, **kwargs) 115650ab98dSLluís Vilanova 11680dd5c49SDaniel P. Berrange def generate_begin(self, events, group): 11780dd5c49SDaniel P. Berrange self._run_function("generate_%s_begin", events, group) 118650ab98dSLluís Vilanova 11980dd5c49SDaniel P. Berrange def generate(self, event, group): 12080dd5c49SDaniel P. Berrange self._run_function("generate_%s", event, group) 121650ab98dSLluís Vilanova 122*3932ef3fSStefan Hajnoczi def generate_backend_dstate(self, event, group): 123*3932ef3fSStefan Hajnoczi self._run_function("generate_%s_backend_dstate", event, group) 124*3932ef3fSStefan Hajnoczi 12580dd5c49SDaniel P. Berrange def generate_end(self, events, group): 12680dd5c49SDaniel P. Berrange self._run_function("generate_%s_end", events, group) 127