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):
|
||||
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];')
|
||||
|
@ -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, ×tamp_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
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user