X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=formats%2Fctf%2Fctf.c;h=ebc6d0e8d2023010e4807b8e2833148f47f7c14f;hb=05984e0cf2b0b9e63e72d601ec4941f7f2a5c13d;hp=7c4d210670753175836ca5858c97f4b7a9a2d4e5;hpb=9a19a512f564cbb301b0b5f1377d64e3b3f0a851;p=babeltrace.git diff --git a/formats/ctf/ctf.c b/formats/ctf/ctf.c index 7c4d2106..ebc6d0e8 100644 --- a/formats/ctf/ctf.c +++ b/formats/ctf/ctf.c @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -84,6 +85,7 @@ int64_t opt_clock_offset; int64_t opt_clock_offset_ns; extern int yydebug; +char *opt_debug_info_dir; /* * TODO: babeltrace_ctf_console_output ensures that we only print @@ -386,7 +388,7 @@ void ctf_print_timestamp_real(FILE *fp, time_t time_s = (time_t) ts_sec_abs; if (is_negative) { - fprintf(stderr, "[warning] Fallback to [sec.ns] for printing negative time value. Use --clock-seconds.\n"); + fprintf(stderr, "[warning] Fallback to [sec.ns] to print negative time value. Use --clock-seconds.\n"); goto seconds; } @@ -921,6 +923,104 @@ void ctf_update_current_packet_index(struct ctf_stream_definition *stream, stream->packets_lost = packets_lost_diff; } +/* + * Find the timerange where all the streams in the trace are active + * simultaneously. + * + * Return 0 and update begin/end if necessary on success, return 1 for + * empty streams and return a negative value on error. + */ +static +int ctf_intersect_trace(struct bt_trace_descriptor *td_read, + uint64_t *begin, uint64_t *end) +{ + struct ctf_trace *tin; + int stream_id, ret = 0; + + tin = container_of(td_read, struct ctf_trace, parent); + + for (stream_id = 0; stream_id < tin->streams->len; + stream_id++) { + int filenr; + struct ctf_stream_declaration *stream_class; + + stream_class = g_ptr_array_index(tin->streams, stream_id); + if (!stream_class) { + continue; + } + for (filenr = 0; filenr < stream_class->streams->len; filenr++) { + struct ctf_file_stream *file_stream; + struct ctf_stream_pos *stream_pos; + struct packet_index *index; + + file_stream = g_ptr_array_index(stream_class->streams, + filenr); + if (!file_stream) { + continue; + } + stream_pos = &file_stream->pos; + if (!stream_pos->packet_index || + stream_pos->packet_index->len <= 0) { + ret = 1; + goto end; + } + index = &g_array_index(stream_pos->packet_index, + struct packet_index, 0); + if (index->ts_real.timestamp_begin > *begin) { + *begin = index->ts_real.timestamp_begin; + } + index = &g_array_index(stream_pos->packet_index, + struct packet_index, + stream_pos->packet_index->len - 1); + if (index->ts_real.timestamp_end < *end) { + *end = index->ts_real.timestamp_end; + } + } + } + +end: + return ret; +} + +/* + * Find the timerange where all streams in the trace collection are active + * simultaneously. + * + * Return 0 on success. + * Return 1 if no intersections are found. + * Return a negative value on error. + */ +int ctf_find_packets_intersection(struct bt_context *ctx, + uint64_t *ts_begin, uint64_t *ts_end) +{ + int ret, i; + + if (!ctx || !ctx->tc || !ctx->tc->array) { + ret = -EINVAL; + goto end; + } + + for (i = 0; i < ctx->tc->array->len; i++) { + struct bt_trace_descriptor *td_read; + + td_read = g_ptr_array_index(ctx->tc->array, i); + if (!td_read) { + continue; + } + ret = ctf_intersect_trace(td_read, ts_begin, ts_end); + if (ret) { + goto end; + } + } + if (*ts_end < *ts_begin) { + ret = 1; + } else { + ret = 0; + } +end: + return ret; +} + /* * for SEEK_CUR: go to next packet. * for SEEK_SET: go to packet numer (index). @@ -2315,8 +2415,14 @@ struct bt_trace_descriptor *ctf_open_trace(const char *path, int flags, goto error; } + ret = trace_debug_info_create(td); + if (ret) { + goto error; + } + return &td->parent; error: + trace_debug_info_destroy(td); g_free(td); return NULL; } @@ -2485,6 +2591,11 @@ struct bt_trace_descriptor *ctf_open_mmap_trace( if (ret) goto error_free; + ret = trace_debug_info_create(td); + if (ret) { + goto error_free; + } + return &td->parent; error_free: @@ -2636,6 +2747,7 @@ int ctf_close_trace(struct bt_trace_descriptor *tdp) } } free(td->metadata_string); + trace_debug_info_destroy(td); g_free(td); return 0; }