X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=formats%2Fctf-text%2Fctf-text.c;h=a837f914b436a01f1fce65fab994e4f55e98cc2e;hp=f1c1f037a1e979d5301650bae1b39f805a9b44de;hb=359d7456178eeebd3f5a11c7ef2050b91f68123b;hpb=ae23d232404678391ac28a103af7be54be03aa61 diff --git a/formats/ctf-text/ctf-text.c b/formats/ctf-text/ctf-text.c index f1c1f037..a837f914 100644 --- a/formats/ctf-text/ctf-text.c +++ b/formats/ctf-text/ctf-text.c @@ -34,7 +34,30 @@ #include #include -struct trace_descriptor *ctf_text_open_trace(const char *path, int flags, +#define NSEC_PER_SEC 1000000000ULL + +int opt_all_field_names, + opt_scope_field_names, + opt_header_field_names, + opt_context_field_names, + opt_payload_field_names, + opt_all_fields, + opt_trace_field, + opt_trace_domain_field, + opt_trace_procname_field, + opt_trace_vpid_field, + opt_loglevel_field, + opt_delta_field = 1; + +enum field_item { + ITEM_SCOPE, + ITEM_HEADER, + ITEM_CONTEXT, + ITEM_PAYLOAD, +}; + +struct trace_descriptor *ctf_text_open_trace(const char *collection_path, + const char *path, int flags, void (*move_pos_slow)(struct ctf_stream_pos *pos, size_t offset, int whence), FILE *metadata_fp); void ctf_text_close_trace(struct trace_descriptor *descriptor); @@ -94,6 +117,40 @@ int print_field(struct definition *definition) return 1; } +static +void set_field_names_print(struct ctf_text_stream_pos *pos, enum field_item item) +{ + switch (item) { + case ITEM_SCOPE: + if (opt_all_field_names || opt_scope_field_names) + pos->print_names = 1; + else + pos->print_names = 0; + break; + case ITEM_HEADER: + if (opt_all_field_names || opt_header_field_names) + pos->print_names = 1; + else + pos->print_names = 0; + break; + case ITEM_CONTEXT: + if (opt_all_field_names || opt_context_field_names) + pos->print_names = 1; + else + pos->print_names = 0; + break; + case ITEM_PAYLOAD: + if (opt_all_field_names || opt_payload_field_names) + pos->print_names = 1; + else + pos->print_names = 0; + + break; + default: + assert(0); + } +} + static int ctf_text_write_event(struct stream_pos *ppos, struct ctf_stream *stream) @@ -106,30 +163,37 @@ int ctf_text_write_event(struct stream_pos *ppos, struct ctf_stream_event *event; uint64_t id; int ret; + int dom_print = 0; id = stream->event_id; if (id >= stream_class->events_by_id->len) { - fprintf(stdout, "[error] Event id %" PRIu64 " is outside range.\n", id); + fprintf(stderr, "[error] Event id %" PRIu64 " is outside range.\n", id); return -EINVAL; } event = g_ptr_array_index(stream->events_by_id, id); if (!event) { - fprintf(stdout, "[error] Event id %" PRIu64 " is unknown.\n", id); + fprintf(stderr, "[error] Event id %" PRIu64 " is unknown.\n", id); return -EINVAL; } event_class = g_ptr_array_index(stream_class->events_by_id, id); if (!event) { - fprintf(stdout, "[error] Event id %" PRIu64 " is unknown.\n", id); + fprintf(stderr, "[error] Event id %" PRIu64 " is unknown.\n", id); return -EINVAL; } if (stream->has_timestamp) { + uint64_t ts_sec, ts_nsec; + + ts_sec = stream->timestamp / NSEC_PER_SEC; + ts_nsec = stream->timestamp % NSEC_PER_SEC; + set_field_names_print(pos, ITEM_HEADER); if (pos->print_names) fprintf(pos->fp, "timestamp = "); else fprintf(pos->fp, "["); - fprintf(pos->fp, "%12" PRIu64, stream->timestamp); + fprintf(pos->fp, "%3" PRIu64 ".%09" PRIu64, + ts_sec, ts_nsec); if (!pos->print_names) fprintf(pos->fp, "]"); @@ -138,6 +202,95 @@ int ctf_text_write_event(struct stream_pos *ppos, else fprintf(pos->fp, " "); } + if ((opt_delta_field || opt_all_fields) && stream->has_timestamp) { + uint64_t delta, delta_sec, delta_nsec; + + set_field_names_print(pos, ITEM_HEADER); + if (pos->print_names) + fprintf(pos->fp, "delta = "); + else + fprintf(pos->fp, "("); + if (pos->last_timestamp != -1ULL) { + delta = stream->timestamp - pos->last_timestamp; + delta_sec = delta / NSEC_PER_SEC; + delta_nsec = delta % NSEC_PER_SEC; + fprintf(pos->fp, "+%" PRIu64 ".%09" PRIu64, + delta_sec, delta_nsec); + } else { + fprintf(pos->fp, "+?.?????????"); + } + if (!pos->print_names) + fprintf(pos->fp, ")"); + + if (pos->print_names) + fprintf(pos->fp, ", "); + else + fprintf(pos->fp, " "); + pos->last_timestamp = stream->timestamp; + } + + if ((opt_trace_field || opt_all_fields) && stream_class->trace->path[0] != '\0') { + set_field_names_print(pos, ITEM_HEADER); + if (pos->print_names) { + fprintf(pos->fp, "trace = "); + } + fprintf(pos->fp, "%s", stream_class->trace->path); + if (pos->print_names) + fprintf(pos->fp, ", "); + else + fprintf(pos->fp, " "); + } + if ((opt_trace_domain_field && !opt_all_fields) && stream_class->trace->domain[0] != '\0') { + set_field_names_print(pos, ITEM_HEADER); + if (pos->print_names) { + fprintf(pos->fp, "trace:domain = "); + } + fprintf(pos->fp, "%s", stream_class->trace->domain); + if (pos->print_names) + fprintf(pos->fp, ", "); + dom_print = 1; + } + if ((opt_trace_procname_field && !opt_all_fields) && stream_class->trace->procname[0] != '\0') { + set_field_names_print(pos, ITEM_HEADER); + if (pos->print_names) { + fprintf(pos->fp, "trace:procname = "); + } else if (dom_print) { + fprintf(pos->fp, ":"); + } + fprintf(pos->fp, "%s", stream_class->trace->procname); + if (pos->print_names) + fprintf(pos->fp, ", "); + dom_print = 1; + } + if ((opt_trace_vpid_field && !opt_all_fields) && stream_class->trace->vpid[0] != '\0') { + set_field_names_print(pos, ITEM_HEADER); + if (pos->print_names) { + fprintf(pos->fp, "trace:vpid = "); + } else if (dom_print) { + fprintf(pos->fp, ":"); + } + fprintf(pos->fp, "%s", stream_class->trace->vpid); + if (pos->print_names) + fprintf(pos->fp, ", "); + dom_print = 1; + } + if ((opt_loglevel_field || opt_all_fields) && event_class->loglevel_identifier != 0) { + set_field_names_print(pos, ITEM_HEADER); + if (pos->print_names) { + fprintf(pos->fp, "loglevel = "); + } else if (dom_print) { + fprintf(pos->fp, ":"); + } + fprintf(pos->fp, "%s (%lld)", + g_quark_to_string(event_class->loglevel_identifier), + (long long) event_class->loglevel_value); + if (pos->print_names) + fprintf(pos->fp, ", "); + dom_print = 1; + } + if (dom_print && !pos->print_names) + fprintf(pos->fp, " "); + set_field_names_print(pos, ITEM_HEADER); if (pos->print_names) fprintf(pos->fp, "name = "); fprintf(pos->fp, "%s", g_quark_to_string(event_class->name)); @@ -150,10 +303,12 @@ int ctf_text_write_event(struct stream_pos *ppos, if (stream->stream_packet_context) { if (pos->field_nr++ != 0) fprintf(pos->fp, ","); + set_field_names_print(pos, ITEM_SCOPE); if (pos->print_names) fprintf(pos->fp, " stream.packet.context ="); field_nr_saved = pos->field_nr; pos->field_nr = 0; + set_field_names_print(pos, ITEM_CONTEXT); ret = generic_rw(ppos, &stream->stream_packet_context->p); if (ret) goto error; @@ -164,10 +319,12 @@ int ctf_text_write_event(struct stream_pos *ppos, if (babeltrace_verbose && stream->stream_event_header) { if (pos->field_nr++ != 0) fprintf(pos->fp, ","); + set_field_names_print(pos, ITEM_SCOPE); if (pos->print_names) fprintf(pos->fp, " stream.event.header ="); field_nr_saved = pos->field_nr; pos->field_nr = 0; + set_field_names_print(pos, ITEM_CONTEXT); ret = generic_rw(ppos, &stream->stream_event_header->p); if (ret) goto error; @@ -178,10 +335,12 @@ int ctf_text_write_event(struct stream_pos *ppos, if (stream->stream_event_context) { if (pos->field_nr++ != 0) fprintf(pos->fp, ","); + set_field_names_print(pos, ITEM_SCOPE); if (pos->print_names) fprintf(pos->fp, " stream.event.context ="); field_nr_saved = pos->field_nr; pos->field_nr = 0; + set_field_names_print(pos, ITEM_CONTEXT); ret = generic_rw(ppos, &stream->stream_event_context->p); if (ret) goto error; @@ -192,10 +351,12 @@ int ctf_text_write_event(struct stream_pos *ppos, if (event->event_context) { if (pos->field_nr++ != 0) fprintf(pos->fp, ","); + set_field_names_print(pos, ITEM_SCOPE); if (pos->print_names) fprintf(pos->fp, " event.context ="); field_nr_saved = pos->field_nr; pos->field_nr = 0; + set_field_names_print(pos, ITEM_CONTEXT); ret = generic_rw(ppos, &event->event_context->p); if (ret) goto error; @@ -206,10 +367,12 @@ int ctf_text_write_event(struct stream_pos *ppos, if (event->event_fields) { if (pos->field_nr++ != 0) fprintf(pos->fp, ","); + set_field_names_print(pos, ITEM_SCOPE); if (pos->print_names) fprintf(pos->fp, " event.fields ="); field_nr_saved = pos->field_nr; pos->field_nr = 0; + set_field_names_print(pos, ITEM_PAYLOAD); ret = generic_rw(ppos, &event->event_fields->p); if (ret) goto error; @@ -222,12 +385,13 @@ int ctf_text_write_event(struct stream_pos *ppos, return 0; error: - fprintf(stdout, "[error] Unexpected end of stream. Either the trace data stream is corrupted or metadata description does not match data layout.\n"); + fprintf(stderr, "[error] Unexpected end of stream. Either the trace data stream is corrupted or metadata description does not match data layout.\n"); return ret; } -struct trace_descriptor *ctf_text_open_trace(const char *path, int flags, +struct trace_descriptor *ctf_text_open_trace(const char *collection_path, + const char *path, int flags, void (*move_pos_slow)(struct ctf_stream_pos *pos, size_t offset, int whence), FILE *metadata_fp) { @@ -236,6 +400,7 @@ struct trace_descriptor *ctf_text_open_trace(const char *path, int flags, pos = g_new0(struct ctf_text_stream_pos, 1); + pos->last_timestamp = -1ULL; switch (flags & O_ACCMODE) { case O_RDWR: if (!path) @@ -247,11 +412,11 @@ struct trace_descriptor *ctf_text_open_trace(const char *path, int flags, pos->fp = fp; pos->parent.rw_table = write_dispatch_table; pos->parent.event_cb = ctf_text_write_event; - pos->print_names = opt_field_names; + pos->print_names = 0; break; case O_RDONLY: default: - fprintf(stdout, "[error] Incorrect open flags.\n"); + fprintf(stderr, "[error] Incorrect open flags.\n"); goto error; }