trace: [simple] Port to generic event information and new control interface

The backend is forced to dump event numbers using 64 bits, as TraceEventID is
an enum.

Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
Lluís Vilanova 2013-03-05 14:47:55 +01:00 committed by Stefan Hajnoczi
parent fd068a953c
commit 60481e210d
3 changed files with 13 additions and 46 deletions

View file

@ -28,17 +28,10 @@ def is_string(arg):
def c(events):
out('#include "trace.h"',
'#include "trace/control.h"',
'#include "trace/simple.h"',
'',
'TraceEvent trace_list[] = {')
for e in events:
out('{.tp_name = "%(name)s", .state=0},',
name = e.name,
)
out('};',
'')
)
for num, event in enumerate(events):
out('void trace_%(name)s(%(args)s)',
@ -63,7 +56,9 @@ def c(events):
out('',
' if (!trace_list[%(event_id)s].state) {',
' TraceEvent *eventp = trace_event_id(%(event_id)s);',
' bool _state = trace_event_get_state_dynamic(eventp);',
' if (!_state) {',
' return;',
' }',
'',
@ -106,6 +101,3 @@ def h(events):
name = event.name,
args = event.args,
)
out('')
out('#define NR_TRACE_EVENTS %d' % len(events))
out('extern TraceEvent trace_list[NR_TRACE_EVENTS];')

View file

@ -218,6 +218,7 @@ int trace_record_start(TraceBufferRecord *rec, TraceEventID event, size_t datasi
{
unsigned int idx, rec_off, old_idx, new_idx;
uint32_t rec_len = sizeof(TraceRecord) + datasize;
uint64_t event_u64 = event;
uint64_t timestamp_ns = get_clock();
do {
@ -235,7 +236,7 @@ int trace_record_start(TraceBufferRecord *rec, TraceEventID event, size_t datasi
idx = old_idx % TRACE_BUF_LEN;
rec_off = idx;
rec_off = write_to_buffer(rec_off, &event, sizeof(event));
rec_off = write_to_buffer(rec_off, &event_u64, sizeof(event_u64));
rec_off = write_to_buffer(rec_off, &timestamp_ns, sizeof(timestamp_ns));
rec_off = write_to_buffer(rec_off, &rec_len, sizeof(rec_len));
@ -359,38 +360,16 @@ void trace_print_events(FILE *stream, fprintf_function stream_printf)
{
unsigned int i;
for (i = 0; i < NR_TRACE_EVENTS; i++) {
for (i = 0; i < trace_event_count(); i++) {
TraceEvent *ev = trace_event_id(i);
stream_printf(stream, "%s [Event ID %u] : state %u\n",
trace_list[i].tp_name, i, trace_list[i].state);
trace_event_get_name(ev), i, trace_event_get_state_dynamic(ev));
}
}
bool trace_event_set_state(const char *name, bool state)
void trace_event_set_state_dynamic_backend(TraceEvent *ev, bool state)
{
unsigned int i;
unsigned int len;
bool wildcard = false;
bool matched = false;
len = strlen(name);
if (len > 0 && name[len - 1] == '*') {
wildcard = true;
len -= 1;
}
for (i = 0; i < NR_TRACE_EVENTS; i++) {
if (wildcard) {
if (!strncmp(trace_list[i].tp_name, name, len)) {
trace_list[i].state = state;
matched = true;
}
continue;
}
if (!strcmp(trace_list[i].tp_name, name)) {
trace_list[i].state = state;
return true;
}
}
return matched;
ev->dstate = state;
}
/* Helper function to create a thread with signals blocked. Use glib's

View file

@ -15,12 +15,8 @@
#include <stdbool.h>
#include <stdio.h>
typedef uint64_t TraceEventID;
#include "trace/generated-events.h"
typedef struct {
const char *tp_name;
bool state;
} TraceEvent;
void st_print_trace_file_status(FILE *stream, fprintf_function stream_printf);
void st_set_trace_file_enabled(bool enable);