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:
parent
fd068a953c
commit
60481e210d
|
@ -28,17 +28,10 @@ def is_string(arg):
|
||||||
|
|
||||||
def c(events):
|
def c(events):
|
||||||
out('#include "trace.h"',
|
out('#include "trace.h"',
|
||||||
|
'#include "trace/control.h"',
|
||||||
'#include "trace/simple.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):
|
for num, event in enumerate(events):
|
||||||
out('void trace_%(name)s(%(args)s)',
|
out('void trace_%(name)s(%(args)s)',
|
||||||
|
@ -63,7 +56,9 @@ def c(events):
|
||||||
|
|
||||||
|
|
||||||
out('',
|
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;',
|
' return;',
|
||||||
' }',
|
' }',
|
||||||
'',
|
'',
|
||||||
|
@ -106,6 +101,3 @@ def h(events):
|
||||||
name = event.name,
|
name = event.name,
|
||||||
args = event.args,
|
args = event.args,
|
||||||
)
|
)
|
||||||
out('')
|
|
||||||
out('#define NR_TRACE_EVENTS %d' % len(events))
|
|
||||||
out('extern TraceEvent trace_list[NR_TRACE_EVENTS];')
|
|
||||||
|
|
|
@ -218,6 +218,7 @@ int trace_record_start(TraceBufferRecord *rec, TraceEventID event, size_t datasi
|
||||||
{
|
{
|
||||||
unsigned int idx, rec_off, old_idx, new_idx;
|
unsigned int idx, rec_off, old_idx, new_idx;
|
||||||
uint32_t rec_len = sizeof(TraceRecord) + datasize;
|
uint32_t rec_len = sizeof(TraceRecord) + datasize;
|
||||||
|
uint64_t event_u64 = event;
|
||||||
uint64_t timestamp_ns = get_clock();
|
uint64_t timestamp_ns = get_clock();
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
@ -235,7 +236,7 @@ int trace_record_start(TraceBufferRecord *rec, TraceEventID event, size_t datasi
|
||||||
idx = old_idx % TRACE_BUF_LEN;
|
idx = old_idx % TRACE_BUF_LEN;
|
||||||
|
|
||||||
rec_off = idx;
|
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, ×tamp_ns, sizeof(timestamp_ns));
|
rec_off = write_to_buffer(rec_off, ×tamp_ns, sizeof(timestamp_ns));
|
||||||
rec_off = write_to_buffer(rec_off, &rec_len, sizeof(rec_len));
|
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;
|
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",
|
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;
|
ev->dstate = state;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Helper function to create a thread with signals blocked. Use glib's
|
/* Helper function to create a thread with signals blocked. Use glib's
|
||||||
|
|
|
@ -15,12 +15,8 @@
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdio.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_print_trace_file_status(FILE *stream, fprintf_function stream_printf);
|
||||||
void st_set_trace_file_enabled(bool enable);
|
void st_set_trace_file_enabled(bool enable);
|
||||||
|
|
Loading…
Reference in a new issue