Discarded event time range is between last packet event and timestamp_end
[babeltrace.git] / formats / ctf-text / ctf-text.c
index a837f914b436a01f1fce65fab994e4f55e98cc2e..f8507e6256093eba7c67fa7083fb1624b03b637e 100644 (file)
@@ -47,7 +47,13 @@ int opt_all_field_names,
        opt_trace_procname_field,
        opt_trace_vpid_field,
        opt_loglevel_field,
-       opt_delta_field = 1;
+       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,
@@ -151,6 +157,75 @@ void set_field_names_print(struct ctf_text_stream_pos *pos, enum field_item item
        }
 }
 
+static
+void ctf_text_print_timestamp(FILE *fp, struct ctf_text_stream_pos *pos,
+                       struct ctf_stream *stream,
+                       uint64_t timestamp)
+{
+       uint64_t ts_sec = 0, ts_nsec;
+       struct ctf_trace *trace = stream->stream_class->trace;
+       struct trace_collection *tc = trace->collection;
+       struct ctf_clock *clock = tc->single_clock;
+
+       ts_nsec = timestamp;
+
+       /* Add offsets */
+       if (!opt_clock_raw && clock) {
+               ts_sec += clock->offset_s;
+               ts_nsec += 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(fp, "%s", timestr);
+               }
+               /* Print time in HH:MM:SS.ns */
+               fprintf(fp, "%02d:%02d:%02d.%09" PRIu64,
+                       tm.tm_hour, tm.tm_min, tm.tm_sec, ts_nsec);
+               goto end;
+       }
+seconds:
+       fprintf(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)
@@ -182,18 +257,26 @@ int ctf_text_write_event(struct stream_pos *ppos,
                return -EINVAL;
        }
 
-       if (stream->has_timestamp) {
-               uint64_t ts_sec, ts_nsec;
+       /* Print events discarded */
+       if (stream->events_discarded) {
+               fflush(stdout);
+               fprintf(stderr, "[warning] Tracer discarded %d events between [",
+                       stream->events_discarded);
+               ctf_text_print_timestamp(stderr, pos, stream, stream->prev_timestamp);
+               fprintf(stderr, "] and [");
+               ctf_text_print_timestamp(stderr, pos, stream, stream->prev_timestamp_end);
+               fprintf(stderr, "]. You should consider increasing the buffer size.\n");
+               fflush(stderr);
+               stream->events_discarded = 0;
+       }
 
-               ts_sec = stream->timestamp / NSEC_PER_SEC;
-               ts_nsec = stream->timestamp % NSEC_PER_SEC;
+       if (stream->has_timestamp) {
                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->fp, pos, stream, stream->timestamp);
                if (!pos->print_names)
                        fprintf(pos->fp, "]");
 
This page took 0.023471 seconds and 4 git commands to generate.