Skip to content

Commit

Permalink
trace: Provide a generic tracing event descriptor
Browse files Browse the repository at this point in the history
Uses tracetool to generate a backend-independent tracing event description
(struct TraceEvent).

The values for such structure are generated with the non-public "events"
backend ("events-c" frontend).

The generation of the defines to check if an event is statically enabled is also
moved to the "events" backend ("events-h" frontend).

Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
  • Loading branch information
Lluís Vilanova authored and stefanhaRH committed Mar 28, 2013
1 parent 93fba16 commit 45be2f5
Show file tree
Hide file tree
Showing 7 changed files with 172 additions and 9 deletions.
3 changes: 3 additions & 0 deletions Makefile
Expand Up @@ -35,6 +35,9 @@ GENERATED_HEADERS = config-host.h qemu-options.def
GENERATED_HEADERS += qmp-commands.h qapi-types.h qapi-visit.h
GENERATED_SOURCES += qmp-marshal.c qapi-types.c qapi-visit.c

GENERATED_HEADERS += trace/generated-events.h
GENERATED_SOURCES += trace/generated-events.c

GENERATED_HEADERS += trace/generated-tracers.h
ifeq ($(TRACE_BACKEND),dtrace)
GENERATED_HEADERS += trace/generated-tracers-dtrace.h
Expand Down
23 changes: 23 additions & 0 deletions scripts/tracetool/backend/events.py
@@ -0,0 +1,23 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
Generic event description.
This is a dummy backend to establish appropriate frontend/backend compatibility
checks.
"""

__author__ = "Lluís Vilanova <vilanova@ac.upc.edu>"
__copyright__ = "Copyright 2012, Lluís Vilanova <vilanova@ac.upc.edu>"
__license__ = "GPL version 2 or (at your option) any later version"

__maintainer__ = "Stefan Hajnoczi"
__email__ = "stefanha@linux.vnet.ibm.com"


def events_h(events):
pass

def events_c(events):
pass
39 changes: 39 additions & 0 deletions scripts/tracetool/format/events_c.py
@@ -0,0 +1,39 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
Generate .c for event description.
"""

__author__ = "Lluís Vilanova <vilanova@ac.upc.edu>"
__copyright__ = "Copyright 2012, Lluís Vilanova <vilanova@ac.upc.edu>"
__license__ = "GPL version 2 or (at your option) any later version"

__maintainer__ = "Stefan Hajnoczi"
__email__ = "stefanha@linux.vnet.ibm.com"


from tracetool import out


def begin(events):
out('/* This file is autogenerated by tracetool, do not edit. */',
'',
'#include "trace.h"',
'#include "trace/generated-events.h"',
'#include "trace/control.h"',
'',
)

out('TraceEvent trace_events[TRACE_EVENT_COUNT] = {')

for e in events:
out(' { .id = %(id)s, .name = \"%(name)s\", .sstate = %(sstate)s, .dstate = 0 },',
id = "TRACE_" + e.name.upper(),
name = e.name,
sstate = "TRACE_%s_ENABLED" % e.name.upper(),
)

out('};',
'',
)
50 changes: 50 additions & 0 deletions scripts/tracetool/format/events_h.py
@@ -0,0 +1,50 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
Generate .h for event description.
"""

__author__ = "Lluís Vilanova <vilanova@ac.upc.edu>"
__copyright__ = "Copyright 2012, Lluís Vilanova <vilanova@ac.upc.edu>"
__license__ = "GPL version 2 or (at your option) any later version"

__maintainer__ = "Stefan Hajnoczi"
__email__ = "stefanha@linux.vnet.ibm.com"


from tracetool import out


def begin(events):
out('/* This file is autogenerated by tracetool, do not edit. */',
'',
'#ifndef TRACE__GENERATED_EVENTS_H',
'#define TRACE__GENERATED_EVENTS_H',
'',
'#include <stdbool.h>',
''
)

# event identifiers
out('typedef enum {')

for e in events:
out(' TRACE_%s,' % e.name.upper())

out(' TRACE_EVENT_COUNT',
'} TraceEventID;',
)

# static state
for e in events:
if 'disable' in e.properties:
enabled = 0
else:
enabled = 1
out('#define TRACE_%s_ENABLED %d' % (e.name.upper(), enabled))

out('#include "trace/event-internal.h"',
'',
'#endif /* TRACE__GENERATED_EVENTS_H */',
)
9 changes: 1 addition & 8 deletions scripts/tracetool/format/h.py
Expand Up @@ -25,14 +25,7 @@ def begin(events):
'#include "qemu-common.h"')

def end(events):
for e in events:
if "disable" in e.properties:
enabled = 0
else:
enabled = 1
out('#define TRACE_%s_ENABLED %d' % (e.name.upper(), enabled))
out('',
'#endif /* TRACE__GENERATED_TRACERS_H */')
out('#endif /* TRACE__GENERATED_TRACERS_H */')

def nop(events):
for e in events:
Expand Down
24 changes: 23 additions & 1 deletion trace/Makefile.objs
@@ -1,7 +1,29 @@
# -*- mode: makefile -*-

######################################################################
# Auto-generated header for tracing routines
# Auto-generated event descriptions

$(obj)/generated-events.h: $(obj)/generated-events.h-timestamp
$(obj)/generated-events.h-timestamp: $(SRC_PATH)/trace-events
$(call quiet-command,$(TRACETOOL) \
--format=events-h \
--backend=events \
< $< > $@," GEN $(patsubst %-timestamp,%,$@)")
@cmp -s $@ $(patsubst %-timestamp,%,$@) || cp $@ $(patsubst %-timestamp,%,$@)

$(obj)/generated-events.c: $(obj)/generated-events.c-timestamp
$(obj)/generated-events.c-timestamp: $(SRC_PATH)/trace-events
$(call quiet-command,$(TRACETOOL) \
--format=events-c \
--backend=events \
< $< > $@," GEN $(patsubst %-timestamp,%,$@)")
@cmp -s $@ $(patsubst %-timestamp,%,$@) || cp $@ $(patsubst %-timestamp,%,$@)

util-obj-y += generated-events.o


######################################################################
# Auto-generated tracing routines

$(obj)/generated-tracers.h: $(obj)/generated-tracers.h-timestamp
@cmp -s $< $@ || cp $< $@
Expand Down
33 changes: 33 additions & 0 deletions trace/event-internal.h
@@ -0,0 +1,33 @@
/*
* Interface for configuring and controlling the state of tracing events.
*
* Copyright (C) 2012 Lluís Vilanova <vilanova@ac.upc.edu>
*
* This work is licensed under the terms of the GNU GPL, version 2 or later.
* See the COPYING file in the top-level directory.
*/

#ifndef TRACE__EVENT_INTERNAL_H
#define TRACE__EVENT_INTERNAL_H

#include "trace/generated-events.h"


/**
* TraceEvent:
* @id: Unique event identifier.
* @name: Event name.
* @sstate: Static tracing state.
* @dstate: Dynamic tracing state.
*
* Opaque generic description of a tracing event.
*/
typedef struct TraceEvent {
TraceEventID id;
const char * name;
const bool sstate;
bool dstate;
} TraceEvent;


#endif /* TRACE__EVENT_INTERNAL_H */

0 comments on commit 45be2f5

Please sign in to comment.