From 2b9a764d5e9e90d1a84e9eb2d433679ad65e91bf Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Mon, 23 May 2011 11:13:54 -0400 Subject: [PATCH] Update timestamps by carrying the overflow Signed-off-by: Mathieu Desnoyers --- formats/ctf/ctf.c | 37 ++++++++++++++++++++++++++++--- include/babeltrace/ctf/metadata.h | 1 - include/babeltrace/ctf/types.h | 2 +- 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/formats/ctf/ctf.c b/formats/ctf/ctf.c index 5e43d2fa..29f95fec 100644 --- a/formats/ctf/ctf.c +++ b/formats/ctf/ctf.c @@ -87,6 +87,32 @@ struct format ctf_format = { .close_trace = ctf_close_trace, }; +static +void ctf_update_timestamp(struct ctf_stream *stream, + struct definition_integer *integer_definition) +{ + struct declaration_integer *integer_declaration = + integer_definition->declaration; + uint64_t oldval, newval, updateval; + + if (integer_declaration->len == 64) { + stream->timestamp = integer_definition->value._unsigned; + return; + } + /* keep low bits */ + oldval = stream->timestamp; + oldval &= (1ULL << integer_declaration->len) - 1; + newval = integer_definition->value._unsigned; + /* Test for overflow by comparing low bits */ + if (newval < oldval) + newval += 1ULL << integer_declaration->len; + /* updateval contains old high bits, and new low bits (sum) */ + updateval = stream->timestamp; + updateval &= ~((1ULL << integer_declaration->len) - 1); + updateval += newval; + stream->timestamp = updateval; +} + static int ctf_read_event(struct stream_pos *ppos, struct ctf_stream *stream) { @@ -132,12 +158,12 @@ int ctf_read_event(struct stream_pos *ppos, struct ctf_stream *stream) /* lookup timestamp */ integer_definition = lookup_integer(&stream_class->event_header->p, "timestamp", FALSE); if (integer_definition) { - stream->timestamp = integer_definition->value._unsigned; + ctf_update_timestamp(stream, integer_definition); } else { if (variant) { integer_definition = lookup_integer(variant, "timestamp", FALSE); if (integer_definition) { - stream->timestamp = integer_definition->value._unsigned; + ctf_update_timestamp(stream, integer_definition); } } } @@ -381,7 +407,12 @@ void ctf_move_pos_slow(struct ctf_stream_pos *pos, size_t offset, int whence) /* Lookup context/packet size in index */ pos->content_size = index->content_size; pos->packet_size = index->packet_size; - pos->offset = index->data_offset; + if (index->data_offset < index->content_size) + pos->offset = index->data_offset; + else { + pos->offset = EOF; + return; + } } /* map new base. Need mapping length from header. */ pos->base = mmap(NULL, pos->packet_size / CHAR_BIT, pos->prot, diff --git a/include/babeltrace/ctf/metadata.h b/include/babeltrace/ctf/metadata.h index e3cd325a..25baa3a9 100644 --- a/include/babeltrace/ctf/metadata.h +++ b/include/babeltrace/ctf/metadata.h @@ -194,5 +194,4 @@ struct metadata_packet_header { HEADER_END; }; - #endif /* _BABELTRACE_CTF_METADATA_H */ diff --git a/include/babeltrace/ctf/types.h b/include/babeltrace/ctf/types.h index 1ec2ad5a..14da1d91 100644 --- a/include/babeltrace/ctf/types.h +++ b/include/babeltrace/ctf/types.h @@ -33,7 +33,7 @@ struct packet_index { off_t offset; /* offset of the packet in the file, in bytes */ - off_t data_offset; /* offset of data within the packet */ + off_t data_offset; /* offset of data within the packet, in bits */ size_t packet_size; /* packet size, in bits */ size_t content_size; /* content size, in bits */ }; -- 2.34.1