From: Mathieu Desnoyers Date: Wed, 2 May 2012 15:48:52 +0000 (-0400) Subject: Fix: support 64-bit events discarded counter types X-Git-Tag: v1.0.0-rc3~3 X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=commitdiff_plain;h=4c4ba0211b25f7a4ef4f3fbd7cda9ee5a4bc6330 Fix: support 64-bit events discarded counter types Previously, counters coming for 64-bit architectures would be treated in the same way as 32-bit counters, and would therefore miss 32-bit overflows (only happens if 2^32 events or more are lost within in a packet). Signed-off-by: Mathieu Desnoyers --- diff --git a/formats/ctf-text/ctf-text.c b/formats/ctf-text/ctf-text.c index 1d29390c..4f5ba73e 100644 --- a/formats/ctf-text/ctf-text.c +++ b/formats/ctf-text/ctf-text.c @@ -244,7 +244,7 @@ int ctf_text_write_event(struct stream_pos *ppos, struct ctf_stream_definition * /* Print events discarded */ if (stream->events_discarded) { fflush(pos->fp); - fprintf(stderr, "[warning] Tracer discarded %d events between [", + fprintf(stderr, "[warning] Tracer discarded %" PRIu64 " events between [", stream->events_discarded); ctf_print_timestamp(stderr, stream, stream->prev_timestamp); fprintf(stderr, "] and ["); diff --git a/formats/ctf/ctf.c b/formats/ctf/ctf.c index bff84fe1..07966632 100644 --- a/formats/ctf/ctf.c +++ b/formats/ctf/ctf.c @@ -594,7 +594,7 @@ void ctf_packet_seek(struct stream_pos *stream_pos, size_t index, int whence) switch (whence) { case SEEK_CUR: { - uint32_t events_discarded_diff; + uint64_t events_discarded_diff; if (pos->offset == EOF) { return; @@ -610,6 +610,13 @@ void ctf_packet_seek(struct stream_pos *stream_pos, size_t index, int whence) struct packet_index, pos->cur_index - 1); events_discarded_diff -= packet_index->events_discarded; + /* + * Deal with 32-bit wrap-around if the + * tracer provided a 32-bit field. + */ + if (packet_index->events_discarded_len == 32) { + events_discarded_diff = (uint32_t) events_discarded_diff; + } } file_stream->parent.events_discarded = events_discarded_diff; file_stream->parent.prev_timestamp = file_stream->parent.timestamp; @@ -643,7 +650,7 @@ void ctf_packet_seek(struct stream_pos *stream_pos, size_t index, int whence) */ if ((&file_stream->parent)->stream_class->trace->collection) { fflush(stdout); - fprintf(stderr, "[warning] Tracer discarded %d events at end of stream between [", + fprintf(stderr, "[warning] Tracer discarded %" PRIu64 " events at end of stream between [", file_stream->parent.events_discarded); ctf_print_timestamp(stderr, &file_stream->parent, file_stream->parent.prev_timestamp); @@ -1296,6 +1303,7 @@ 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.events_discarded = get_unsigned_int(field); + packet_index.events_discarded_len = get_int_len(field); } } else { /* Use file size for packet size */ diff --git a/include/babeltrace/ctf-ir/metadata.h b/include/babeltrace/ctf-ir/metadata.h index c18749f7..a24dafab 100644 --- a/include/babeltrace/ctf-ir/metadata.h +++ b/include/babeltrace/ctf-ir/metadata.h @@ -52,9 +52,9 @@ struct ctf_stream_definition { struct ctf_clock *current_clock; /* Event discarded information */ - uint32_t events_discarded; - uint64_t prev_timestamp; /* Last event */ - uint64_t prev_timestamp_end; /* End-of-packet timestamp */ + uint64_t events_discarded; + uint64_t prev_timestamp; /* Start-of-last-packet timestamp */ + uint64_t prev_timestamp_end; /* End-of-last-packet timestamp */ }; struct ctf_event_definition { diff --git a/include/babeltrace/ctf/types.h b/include/babeltrace/ctf/types.h index 9e429bd3..14a7e3d4 100644 --- a/include/babeltrace/ctf/types.h +++ b/include/babeltrace/ctf/types.h @@ -40,7 +40,8 @@ struct packet_index { uint64_t content_size; /* content size, in bits */ uint64_t timestamp_begin; uint64_t timestamp_end; - uint32_t events_discarded; + uint64_t events_discarded; + size_t events_discarded_len; /* length of the field, in bits */ }; /*