X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=formats%2Fctf-text%2Fctf-text.c;h=19e92fcabdf836fe909c703450f0133b8847b6a2;hp=f1ddbaf5e77b18f2f3855d9f7f2d23a708efe949;hb=bfe74b8ca7c28bd69c13ed88e14eee43f2786a47;hpb=70bd0a12b09ce7f233189cf07e090fda593ebc48 diff --git a/formats/ctf-text/ctf-text.c b/formats/ctf-text/ctf-text.c index f1ddbaf5..19e92fca 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_trace_name, + opt_trace_domain, + opt_trace_procname, + opt_trace_vpid, + opt_loglevel; + +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); static @@ -92,6 +115,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) @@ -104,6 +161,7 @@ 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; @@ -123,11 +181,17 @@ int ctf_text_write_event(struct stream_pos *ppos, } 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, "]"); @@ -136,6 +200,76 @@ int ctf_text_write_event(struct stream_pos *ppos, else fprintf(pos->fp, " "); } + if ((opt_trace_name || opt_all_field_names) && stream_class->trace->path[0] != '\0') { + set_field_names_print(pos, ITEM_HEADER); + if (pos->print_names) { + if (opt_trace_name || opt_all_field_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) && stream_class->trace->domain[0] != '\0') { + set_field_names_print(pos, ITEM_HEADER); + if (pos->print_names) { + fprintf(pos->fp, "trace:domain = "); + } + if (opt_trace_domain) + fprintf(pos->fp, "%s", stream_class->trace->domain); + if (pos->print_names) + fprintf(pos->fp, ", "); + dom_print = 1; + } + if ((opt_trace_procname) && 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, ":"); + } + + if (opt_trace_procname) + fprintf(pos->fp, "%s", stream_class->trace->procname); + if (pos->print_names) + fprintf(pos->fp, ", "); + dom_print = 1; + } + if ((opt_trace_vpid) && 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, ":"); + } + + if (opt_trace_vpid) + fprintf(pos->fp, "%s", stream_class->trace->vpid); + if (pos->print_names) + fprintf(pos->fp, ", "); + dom_print = 1; + } + if ((opt_loglevel || opt_all_field_names) && 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)); @@ -148,10 +282,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; @@ -162,10 +298,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; @@ -176,10 +314,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; @@ -190,10 +330,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; @@ -204,10 +346,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; @@ -225,7 +369,10 @@ error: } -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) { struct ctf_text_stream_pos *pos; FILE *fp; @@ -243,7 +390,7 @@ 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: