X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=formats%2Fctf-text%2Fctf-text.c;h=35b26235714b236c31625b2797d41815561c739b;hb=70accc147c2372e8fc37d244525ffccb7be73d9a;hp=1b3e4bc73438716289662696e8da6c4b33410c2e;hpb=d86d62f815e8fce21a7efb2cc0811720d62b0c11;p=babeltrace.git diff --git a/formats/ctf-text/ctf-text.c b/formats/ctf-text/ctf-text.c index 1b3e4bc7..35b26235 100644 --- a/formats/ctf-text/ctf-text.c +++ b/formats/ctf-text/ctf-text.c @@ -34,16 +34,26 @@ #include #include +#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; + 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, + opt_clock_raw, + opt_clock_seconds, + opt_clock_date, + opt_clock_gmt; + +uint64_t opt_clock_offset; enum field_item { ITEM_SCOPE, @@ -147,6 +157,73 @@ void set_field_names_print(struct ctf_text_stream_pos *pos, enum field_item item } } +static +void ctf_text_print_timestamp(struct ctf_text_stream_pos *pos, + struct ctf_stream *stream) +{ + uint64_t ts_sec = 0, ts_nsec; + //need to get the clock offset at trace collection level. TODO + //struct ctf_trace *trace = stream->stream_class->trace; + + ts_nsec = stream->timestamp; + + /* Add offsets */ + if (!opt_clock_raw) { + //ts_sec += pos->clock_offset_s; + //ts_nsec += pos->clock_offset; + } + ts_sec += opt_clock_offset; + + ts_sec += ts_nsec / NSEC_PER_SEC; + ts_nsec = ts_nsec % NSEC_PER_SEC; + + if (!opt_clock_seconds) { + struct tm tm; + time_t time_s = (time_t) ts_sec; + + if (!opt_clock_gmt) { + struct tm *res; + + res = localtime_r(&time_s, &tm); + if (!res) { + fprintf(stderr, "[warning] Unable to get localtime.\n"); + goto seconds; + } + } else { + struct tm *res; + + res = gmtime_r(&time_s, &tm); + if (!res) { + fprintf(stderr, "[warning] Unable to get gmtime.\n"); + goto seconds; + } + } + if (opt_clock_date) { + char timestr[26]; + size_t res; + + /* Print date and time */ + res = strftime(timestr, sizeof(timestr), + "%F ", &tm); + if (!res) { + fprintf(stderr, "[warning] Unable to print ascii time.\n"); + goto seconds; + } + fprintf(pos->fp, "%s", timestr); + } + /* Print time in HH:MM:SS.ns */ + fprintf(pos->fp, "%02d:%02d:%02d.%09" PRIu64, + tm.tm_hour, tm.tm_min, tm.tm_sec, ts_nsec); + goto end; + } +seconds: + fprintf(pos->fp, "%3" PRIu64 ".%09" PRIu64, + ts_sec, ts_nsec); + +end: + return; +} + static int ctf_text_write_event(struct stream_pos *ppos, struct ctf_stream *stream) @@ -164,17 +241,17 @@ int ctf_text_write_event(struct stream_pos *ppos, 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; } @@ -184,7 +261,7 @@ int ctf_text_write_event(struct stream_pos *ppos, fprintf(pos->fp, "timestamp = "); else fprintf(pos->fp, "["); - fprintf(pos->fp, "%12" PRIu64, stream->timestamp); + ctf_text_print_timestamp(pos, stream); if (!pos->print_names) fprintf(pos->fp, "]"); @@ -193,66 +270,85 @@ 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') { + 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) { - if (opt_trace_name || opt_all_field_names) - fprintf(pos->fp, "trace = "); + 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) && stream_class->trace->domain[0] != '\0') { + 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 = "); } - if (opt_trace_domain) - fprintf(pos->fp, "%s", stream_class->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') { + 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, ":"); } - - if (opt_trace_procname) - fprintf(pos->fp, "%s", stream_class->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') { + 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, ":"); } - - if (opt_trace_vpid) - fprintf(pos->fp, "%s", stream_class->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) { + 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); @@ -357,7 +453,7 @@ 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; } @@ -372,6 +468,7 @@ struct trace_descriptor *ctf_text_open_trace(const char *collection_path, pos = g_new0(struct ctf_text_stream_pos, 1); + pos->last_timestamp = -1ULL; switch (flags & O_ACCMODE) { case O_RDWR: if (!path) @@ -387,7 +484,7 @@ struct trace_descriptor *ctf_text_open_trace(const char *collection_path, break; case O_RDONLY: default: - fprintf(stdout, "[error] Incorrect open flags.\n"); + fprintf(stderr, "[error] Incorrect open flags.\n"); goto error; }