X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;ds=sidebyside;f=formats%2Fctf-text%2Fctf-text.c;h=35b26235714b236c31625b2797d41815561c739b;hb=11ac667403ca915f51cc5981fa4bb8bd443fb606;hp=19e92fcabdf836fe909c703450f0133b8847b6a2;hpb=bfe74b8ca7c28bd69c13ed88e14eee43f2786a47;p=babeltrace.git diff --git a/formats/ctf-text/ctf-text.c b/formats/ctf-text/ctf-text.c index 19e92fca..35b26235 100644 --- a/formats/ctf-text/ctf-text.c +++ b/formats/ctf-text/ctf-text.c @@ -41,11 +41,19 @@ int opt_all_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, @@ -149,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) @@ -166,32 +241,27 @@ 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; } 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, "%3" PRIu64 ".%09" PRIu64, - ts_sec, ts_nsec); + ctf_text_print_timestamp(pos, stream); if (!pos->print_names) fprintf(pos->fp, "]"); @@ -200,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); @@ -364,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; } @@ -379,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) @@ -394,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; }