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[] = {
.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.
*/
static
-void ctf_update_timestamp(struct ctf_stream *stream,
+void ctf_update_timestamp(struct ctf_stream_definition *stream,
struct definition_integer *integer_definition)
{
struct declaration_integer *integer_declaration =
* applying offsets as needed (unix time).
*/
void ctf_print_timestamp(FILE *fp,
- struct ctf_stream *stream,
+ struct ctf_stream_definition *stream,
uint64_t timestamp)
{
uint64_t ts_sec = 0, ts_nsec;
}
static
-int ctf_read_event(struct stream_pos *ppos, struct ctf_stream *stream)
+int ctf_read_event(struct stream_pos *ppos, struct ctf_stream_definition *stream)
{
struct ctf_stream_pos *pos =
container_of(ppos, struct ctf_stream_pos, parent);
}
static
-int ctf_write_event(struct stream_pos *pos, struct ctf_stream *stream)
+int ctf_write_event(struct stream_pos *pos, struct ctf_stream_definition *stream)
{
struct ctf_stream_declaration *stream_class = stream->stream_class;
struct ctf_event_definition *event;
ctf_scanner_free(scanner);
end_scanner_alloc:
end_packet_read:
- fclose(fp);
+ if (fp)
+ fclose(fp);
free(buf);
end_stream:
close(metadata_stream->pos.fd);
static
struct ctf_event_definition *create_event_definitions(struct ctf_trace *td,
- struct ctf_stream *stream,
- struct ctf_event *event)
+ struct ctf_stream_definition *stream,
+ struct ctf_event_declaration *event)
{
struct ctf_event_definition *stream_event = g_new0(struct ctf_event_definition, 1);
struct definition_struct, p);
stream->parent_def_scope = stream_event->event_fields->p.scope;
}
+ stream_event->stream = stream;
return stream_event;
error:
}
static
-int create_stream_definitions(struct ctf_trace *td, struct ctf_stream *stream)
+int create_stream_definitions(struct ctf_trace *td, struct ctf_stream_definition *stream)
{
struct ctf_stream_declaration *stream_class;
int ret;
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)
}
static
-int create_trace_definitions(struct ctf_trace *td, struct ctf_stream *stream)
+int create_trace_definitions(struct ctf_trace *td, struct ctf_stream_definition *stream)
{
int ret;
/* Open trace directory */
td->dir = opendir(path);
if (!td->dir) {
- fprintf(stderr, "[error] Unable to open trace directory.\n");
+ fprintf(stderr, "[error] Unable to open trace directory \"%s\".\n", path);
ret = -ENOENT;
goto error;
}
td->dirfd = open(path, 0);
if (td->dirfd < 0) {
- fprintf(stderr, "[error] Unable to open trace directory file descriptor.\n");
+ fprintf(stderr, "[error] Unable to open trace directory file descriptor for path \"%s\".\n", path);
perror("Trace directory open");
ret = -errno;
goto error_dirfd;
ret = ctf_open_trace_metadata_read(td, packet_seek, metadata_fp);
if (ret) {
+ fprintf(stderr, "[warning] Unable to open trace metadata for path \"%s\".\n", path);
goto error_metadata;
}
}
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);
+ if (event->context_decl)
+ g_ptr_array_free(event->context_decl, TRUE);
+ if (event->fields_decl)
+ g_ptr_array_free(event->fields_decl, TRUE);
+ if (event->packet_header_decl)
+ g_ptr_array_free(event->packet_header_decl, TRUE);
+ if (event->event_context_decl)
+ g_ptr_array_free(event->event_context_decl, TRUE);
+ if (event->event_header_decl)
+ g_ptr_array_free(event->event_header_decl, TRUE);
+ if (event->packet_context_decl)
+ g_ptr_array_free(event->packet_context_decl, TRUE);
+ g_free(event);
+ }
+ g_ptr_array_free(td->event_declarations, TRUE);
+ }
closedir(td->dir);
g_free(td);
}