/* For each event, print header, context, payload */
/* TODO: order events by timestamps across streams */
for (;;) {
- ret = sin->pos.parent.event_cb(&sin->pos.parent, sin->stream);
+ ret = sin->pos.parent.event_cb(&sin->pos.parent, &sin->stream);
if (ret == EOF)
break;
else if (ret) {
fprintf(stdout, "[error] Reading event failed.\n");
goto error;
}
- ret = sout->parent.event_cb(&sout->parent, sin->stream);
+ ret = sout->parent.event_cb(&sout->parent, &sin->stream);
if (ret) {
fprintf(stdout, "[error] Writing event failed.\n");
goto error;
static
int ctf_text_write_event(struct stream_pos *ppos,
- struct ctf_stream_class *stream_class)
+ struct ctf_stream *stream)
{
struct ctf_text_stream_pos *pos =
container_of(ppos, struct ctf_text_stream_pos, parent);
+ struct ctf_stream_class *stream_class = stream->stream_class;
struct ctf_event *event_class;
uint64_t id = 0;
int len_index;
fprintf(pos->fp, "timestamp = ");
else
fprintf(pos->fp, "[");
- fprintf(pos->fp, "%" PRIu64, (uint64_t) 0); /* TODO */
+ fprintf(pos->fp, "%12" PRIu64, stream->timestamp);
if (!pos->print_names)
fprintf(pos->fp, "]");
else
fprintf(pos->fp, ": ");
- if (stream_class->event_header) {
+ /* Only show the event header in verbose mode */
+ if (babeltrace_verbose && stream_class->event_header) {
if (field_nr++ != 0)
fprintf(pos->fp, ", ");
if (pos->print_names)
};
static
-int ctf_read_event(struct stream_pos *ppos, struct ctf_stream_class *stream_class)
+int ctf_read_event(struct stream_pos *ppos, struct ctf_stream *stream)
{
struct ctf_stream_pos *pos =
container_of(ppos, struct ctf_stream_pos, parent);
+ struct ctf_stream_class *stream_class = stream->stream_class;
struct ctf_event *event_class;
uint64_t id = 0;
int len_index;
assert(defint->declaration->signedness == FALSE);
id = defint->value._unsigned; /* set id */
}
+
+ /* lookup timestamp */
+ len_index = struct_declaration_lookup_field_index(stream_class->event_header_decl,
+ g_quark_from_static_string("timestamp"));
+ if (len_index >= 0) {
+ struct definition_integer *defint;
+ struct definition *field;
+
+ field = struct_definition_get_field_from_index(stream_class->event_header, len_index);
+ assert(field->declaration->id == CTF_TYPE_INTEGER);
+ defint = container_of(field, struct definition_integer, p);
+ assert(defint->declaration->signedness == FALSE);
+ /* update timestamp */
+ stream->timestamp = defint->value._unsigned;
+ }
+
}
/* Read stream-declared event context */
}
static
-int ctf_write_event(struct stream_pos *pos, struct ctf_stream_class *stream_class)
+int ctf_write_event(struct stream_pos *pos, struct ctf_stream *stream)
{
+ struct ctf_stream_class *stream_class = stream->stream_class;
struct ctf_event *event_class;
uint64_t id = 0;
int len_index;
fprintf(stdout, "[error] Stream %" PRIu64 " is not declared in metadata.\n", stream_id);
return -EINVAL;
}
- file_stream->stream = stream;
+ file_stream->stream.stream_class = stream;
}
first_packet = 0;
if (ret)
goto error_index;
/* Add stream file to stream class */
- g_ptr_array_add(file_stream->stream->files, file_stream);
+ g_ptr_array_add(file_stream->stream.stream_class->files, file_stream);
return 0;
error_index:
struct ctf_trace;
struct ctf_stream_class;
+struct ctf_stream;
struct ctf_event;
+struct ctf_stream {
+ struct ctf_stream_class *stream_class;
+ uint64_t timestamp; /* Current timestamp, in ns */
+};
+
struct ctf_file_stream {
uint64_t stream_id;
- struct ctf_stream_class *stream;
+ struct ctf_stream stream;
struct ctf_stream_pos pos; /* current stream position */
};
/* Preallocate this many fields for structures */
#define DEFAULT_NR_STRUCT_FIELDS 8
-struct ctf_stream_class;
+struct ctf_stream;
struct stream_pos;
struct format;
struct definition;
/* read/write dispatch table. Specific to plugin used for stream. */
rw_dispatch *rw_table; /* rw dispatch table */
int (*event_cb)(struct stream_pos *pos,
- struct ctf_stream_class *stream_class);
+ struct ctf_stream *stream);
};
static inline