X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=formats%2Fctf%2Fctf.c;h=32206166b2a2c43a637dbf7e0e36489d297bd0da;hp=22051f18b027c922470b6bd5a069562a87f744e2;hb=30c276af575248a4f83e594c987264f6caa238ba;hpb=9e88d150c4119a0c6d6288cad6d6db87df7bac4b diff --git a/formats/ctf/ctf.c b/formats/ctf/ctf.c index 22051f18..32206166 100644 --- a/formats/ctf/ctf.c +++ b/formats/ctf/ctf.c @@ -87,6 +87,12 @@ void ctf_set_handle(struct trace_descriptor *descriptor, static void ctf_close_trace(struct trace_descriptor *descriptor); +static +uint64_t ctf_timestamp_begin(struct trace_descriptor *descriptor, + struct bt_trace_handle *handle); +static +uint64_t ctf_timestamp_end(struct trace_descriptor *descriptor, + struct bt_trace_handle *handle); static rw_dispatch read_dispatch_table[] = { @@ -119,8 +125,97 @@ struct format ctf_format = { .close_trace = ctf_close_trace, .set_context = ctf_set_context, .set_handle = ctf_set_handle, + .timestamp_begin = ctf_timestamp_begin, + .timestamp_end = ctf_timestamp_end, }; +static +uint64_t ctf_timestamp_begin(struct trace_descriptor *descriptor, + struct bt_trace_handle *handle) +{ + struct ctf_trace *tin; + uint64_t begin = ULLONG_MAX; + int i, j; + + tin = container_of(descriptor, struct ctf_trace, parent); + + if (!tin) + goto error; + + /* for each stream_class */ + for (i = 0; i < tin->streams->len; i++) { + struct ctf_stream_declaration *stream_class; + + stream_class = g_ptr_array_index(tin->streams, i); + /* for each file_stream */ + for (j = 0; j < stream_class->streams->len; j++) { + struct ctf_stream_definition *stream; + struct ctf_file_stream *cfs; + struct ctf_stream_pos *stream_pos; + struct packet_index *index; + + stream = g_ptr_array_index(stream_class->streams, j); + cfs = container_of(stream, struct ctf_file_stream, + parent); + stream_pos = &cfs->pos; + + index = &g_array_index(stream_pos->packet_index, + struct packet_index, 0); + if (index->timestamp_begin < begin) + begin = index->timestamp_begin; + } + } + + return begin; + +error: + return -1ULL; +} + +static +uint64_t ctf_timestamp_end(struct trace_descriptor *descriptor, + struct bt_trace_handle *handle) +{ + struct ctf_trace *tin; + uint64_t end = 0; + int i, j; + + tin = container_of(descriptor, struct ctf_trace, parent); + + if (!tin) + goto error; + + /* for each stream_class */ + for (i = 0; i < tin->streams->len; i++) { + struct ctf_stream_declaration *stream_class; + + stream_class = g_ptr_array_index(tin->streams, i); + /* for each file_stream */ + for (j = 0; j < stream_class->streams->len; j++) { + struct ctf_stream_definition *stream; + struct ctf_file_stream *cfs; + struct ctf_stream_pos *stream_pos; + struct packet_index *index; + + stream = g_ptr_array_index(stream_class->streams, j); + cfs = container_of(stream, struct ctf_file_stream, + parent); + stream_pos = &cfs->pos; + + index = &g_array_index(stream_pos->packet_index, + struct packet_index, + stream_pos->packet_index->len - 1); + if (index->timestamp_end > end) + end = index->timestamp_end; + } + } + + return end; + +error: + return -1ULL; +} + /* * Update stream current timestamp, keep at clock frequency. */ @@ -900,7 +995,7 @@ end_stream: static struct ctf_event_definition *create_event_definitions(struct ctf_trace *td, struct ctf_stream_definition *stream, - struct ctf_event *event) + struct ctf_event_declaration *event) { struct ctf_event_definition *stream_event = g_new0(struct ctf_event_definition, 1); @@ -926,6 +1021,7 @@ struct ctf_event_definition *create_event_definitions(struct ctf_trace *td, struct definition_struct, p); stream->parent_def_scope = stream_event->event_fields->p.scope; } + stream_event->stream = stream; return stream_event; error: @@ -987,7 +1083,7 @@ int create_stream_definitions(struct ctf_trace *td, struct ctf_stream_definition stream->events_by_id = g_ptr_array_new(); g_ptr_array_set_size(stream->events_by_id, stream_class->events_by_id->len); for (i = 0; i < stream->events_by_id->len; i++) { - struct ctf_event *event = g_ptr_array_index(stream_class->events_by_id, i); + struct ctf_event_declaration *event = g_ptr_array_index(stream_class->events_by_id, i); struct ctf_event_definition *stream_event; if (!event) @@ -1616,6 +1712,16 @@ void ctf_close_trace(struct trace_descriptor *tdp) } g_ptr_array_free(td->streams, TRUE); } + + if (td->event_declarations) { + for (i = 0; i < td->event_declarations->len; i++) { + struct bt_ctf_event_decl *event; + + event = g_ptr_array_index(td->event_declarations, i); + g_free(event); + } + g_ptr_array_free(td->event_declarations, TRUE); + } closedir(td->dir); g_free(td); }