From: Julien Desfossez Date: Wed, 15 Aug 2012 21:32:01 +0000 (-0400) Subject: Fix: add mmap_base_offset to ctf_stream_pos X-Git-Tag: v1.0.0-rc5~26 X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=commitdiff_plain;h=474150688a81e2bc487aaa9932af6a0585e5fb79 Fix: add mmap_base_offset to ctf_stream_pos When dealing with mmap traces, the whole trace buffer is mmapped in babeltrace and we may need to read it one subbuffer at a time. In order to do that, we need to keep a reference of the base of the current subbuffer inside the mmap region. Signed-off-by: Julien Desfossez Signed-off-by: Mathieu Desnoyers --- diff --git a/formats/ctf/types/integer.c b/formats/ctf/types/integer.c index 07c07be6..71ac0f44 100644 --- a/formats/ctf/types/integer.c +++ b/formats/ctf/types/integer.c @@ -223,20 +223,24 @@ int ctf_integer_read(struct stream_pos *ppos, struct definition *definition) if (!integer_declaration->signedness) { if (integer_declaration->byte_order == LITTLE_ENDIAN) - bt_bitfield_read_le(mmap_align_addr(pos->base_mma), unsigned long, + bt_bitfield_read_le(mmap_align_addr(pos->base_mma) + + pos->mmap_base_offset, unsigned long, pos->offset, integer_declaration->len, &integer_definition->value._unsigned); else - bt_bitfield_read_be(mmap_align_addr(pos->base_mma), unsigned long, + bt_bitfield_read_be(mmap_align_addr(pos->base_mma) + + pos->mmap_base_offset, unsigned long, pos->offset, integer_declaration->len, &integer_definition->value._unsigned); } else { if (integer_declaration->byte_order == LITTLE_ENDIAN) - bt_bitfield_read_le(mmap_align_addr(pos->base_mma), unsigned long, + bt_bitfield_read_le(mmap_align_addr(pos->base_mma) + + pos->mmap_base_offset, unsigned long, pos->offset, integer_declaration->len, &integer_definition->value._signed); else - bt_bitfield_read_be(mmap_align_addr(pos->base_mma), unsigned long, + bt_bitfield_read_be(mmap_align_addr(pos->base_mma) + + pos->mmap_base_offset, unsigned long, pos->offset, integer_declaration->len, &integer_definition->value._signed); } @@ -266,20 +270,24 @@ int ctf_integer_write(struct stream_pos *ppos, struct definition *definition) goto end; if (!integer_declaration->signedness) { if (integer_declaration->byte_order == LITTLE_ENDIAN) - bt_bitfield_write_le(mmap_align_addr(pos->base_mma), unsigned long, + bt_bitfield_write_le(mmap_align_addr(pos->base_mma) + + pos->mmap_base_offset, unsigned long, pos->offset, integer_declaration->len, integer_definition->value._unsigned); else - bt_bitfield_write_be(mmap_align_addr(pos->base_mma), unsigned long, + bt_bitfield_write_be(mmap_align_addr(pos->base_mma) + + pos->mmap_base_offset, unsigned long, pos->offset, integer_declaration->len, integer_definition->value._unsigned); } else { if (integer_declaration->byte_order == LITTLE_ENDIAN) - bt_bitfield_write_le(mmap_align_addr(pos->base_mma), unsigned long, + bt_bitfield_write_le(mmap_align_addr(pos->base_mma) + + pos->mmap_base_offset, unsigned long, pos->offset, integer_declaration->len, integer_definition->value._signed); else - bt_bitfield_write_be(mmap_align_addr(pos->base_mma), unsigned long, + bt_bitfield_write_be(mmap_align_addr(pos->base_mma) + + pos->mmap_base_offset, unsigned long, pos->offset, integer_declaration->len, integer_definition->value._signed); } diff --git a/include/babeltrace/ctf/types.h b/include/babeltrace/ctf/types.h index 43afaef7..94231555 100644 --- a/include/babeltrace/ctf/types.h +++ b/include/babeltrace/ctf/types.h @@ -59,6 +59,7 @@ struct ctf_stream_pos { /* Current position */ off_t mmap_offset; /* mmap offset in the file, in bytes */ + off_t mmap_base_offset; /* offset of start of packet in mmap, in bytes */ size_t packet_size; /* current packet size, in bits */ size_t content_size; /* current content size, in bits */ uint32_t *content_size_loc; /* pointer to current content size */ @@ -148,7 +149,8 @@ char *ctf_get_pos_addr(struct ctf_stream_pos *pos) { /* Only makes sense to get the address after aligning on CHAR_BIT */ assert(!(pos->offset % CHAR_BIT)); - return mmap_align_addr(pos->base_mma) + (pos->offset / CHAR_BIT); + return mmap_align_addr(pos->base_mma) + + pos->mmap_base_offset + (pos->offset / CHAR_BIT); } static inline