Add time delta to ctf-text
[babeltrace.git] / formats / ctf-text / ctf-text.c
index 1b3e4bc73438716289662696e8da6c4b33410c2e..b1018c6576f2084fa3fb300225c8b1e72ea98271 100644 (file)
@@ -34,6 +34,8 @@
 #include <unistd.h>
 #include <stdlib.h>
 
+#define NSEC_PER_SEC 1000000000ULL
+
 int opt_all_field_names,
        opt_scope_field_names,
        opt_header_field_names,
@@ -43,7 +45,8 @@ int opt_all_field_names,
        opt_trace_domain,
        opt_trace_procname,
        opt_trace_vpid,
-       opt_loglevel;
+       opt_loglevel,
+       opt_delta = 1;
 
 enum field_item {
        ITEM_SCOPE,
@@ -179,12 +182,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, "]");
 
@@ -193,6 +201,33 @@ int ctf_text_write_event(struct stream_pos *ppos,
                else
                        fprintf(pos->fp, " ");
        }
+       if (opt_delta && 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_name || opt_all_field_names) && stream_class->trace->path[0] != '\0') {
                set_field_names_print(pos, ITEM_HEADER);
                if (pos->print_names) {
@@ -372,6 +407,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)
This page took 0.02588 seconds and 4 git commands to generate.