Fix: add mmap_base_offset to ctf_stream_pos
authorJulien Desfossez <jdesfossez@efficios.com>
Wed, 15 Aug 2012 21:32:01 +0000 (17:32 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Wed, 15 Aug 2012 21:32:01 +0000 (17:32 -0400)
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 <jdesfossez@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
formats/ctf/types/integer.c
include/babeltrace/ctf/types.h

index 07c07be6e709aeb7eccd065fe17f02fc320a8b57..71ac0f448c0a446b59edf9a5b86688763dde33db 100644 (file)
@@ -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);
        }
index 43afaef78e182277e70c4edbe14c517333765471..94231555c10dad3763a785b837040d08f410d52e 100644 (file)
@@ -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
This page took 0.027872 seconds and 4 git commands to generate.