Print time range during which events have been dropped
[babeltrace.git] / formats / ctf / ctf.c
index 03312f59303bb4ced8691bec3f1c2fd82bac1acc..c343f18366acb0ed22517957fb1e4608e2683a99 100644 (file)
@@ -121,6 +121,7 @@ void ctf_update_timestamp(struct ctf_stream *stream,
        updateval = stream->timestamp;
        updateval &= ~((1ULL << integer_declaration->len) - 1);
        updateval += newval;
+       stream->prev_timestamp = stream->timestamp;
        stream->timestamp = updateval;
 }
 
@@ -392,15 +393,32 @@ void ctf_move_pos_slow(struct ctf_stream_pos *pos, size_t offset, int whence)
        read_next_packet:
                switch (whence) {
                case SEEK_CUR:
+               {
+                       uint32_t events_discarded_diff;
+
+                       /* Print lost event count */
+                       index = &g_array_index(pos->packet_index,
+                                       struct packet_index, pos->cur_index);
+                       events_discarded_diff = index->events_discarded;
+                       if (pos->cur_index > 0) {
+                               index = &g_array_index(pos->packet_index,
+                                               struct packet_index,
+                                               pos->cur_index - 1);
+                               events_discarded_diff -= index->events_discarded;
+                       }
+                       file_stream->parent.events_discarded = events_discarded_diff;
                        if (pos->offset == EOF)
                                return;
                        /* The reader will expect us to skip padding */
                        assert(pos->offset + offset == pos->content_size);
                        ++pos->cur_index;
+                       file_stream->parent.prev_timestamp = file_stream->parent.timestamp;
                        break;
+               }
                case SEEK_SET:
                        assert(offset == 0);    /* only seek supported for now */
                        pos->cur_index = 0;
+                       file_stream->parent.prev_timestamp = 0;
                        break;
                default:
                        assert(0);
@@ -904,6 +922,7 @@ int create_stream_packet_index(struct ctf_trace *td,
                packet_index.packet_size = 0;
                packet_index.timestamp_begin = 0;
                packet_index.timestamp_end = 0;
+               packet_index.events_discarded = 0;
 
                /* read and check header, set stream id (and check) */
                if (file_stream->parent.trace_packet_header) {
@@ -1031,6 +1050,15 @@ int create_stream_packet_index(struct ctf_trace *td,
                                field = struct_definition_get_field_from_index(file_stream->parent.stream_packet_context, len_index);
                                packet_index.timestamp_end = get_unsigned_int(field);
                        }
+
+                       /* read events discarded from header */
+                       len_index = struct_declaration_lookup_field_index(file_stream->parent.stream_packet_context->declaration, g_quark_from_static_string("events_discarded"));
+                       if (len_index >= 0) {
+                               struct definition *field;
+
+                               field = struct_definition_get_field_from_index(file_stream->parent.stream_packet_context, len_index);
+                               packet_index.events_discarded = get_unsigned_int(field);
+                       }
                } else {
                        /* Use file size for packet size */
                        packet_index.content_size = filestats.st_size * CHAR_BIT;
This page took 0.024409 seconds and 4 git commands to generate.