#include <babeltrace/types.h>
#include <stdint.h>
+#include <unistd.h>
#include <glib.h>
+struct packet_index {
+ off_t offset; /* offset of the packet in the file, in bytes */
+ size_t packet_size; /* packet size, in bits */
+ size_t content_size; /* content size, in bits */
+};
+
+/*
+ * Always update stream_pos with move_pos and init_pos.
+ */
+struct stream_pos {
+ int fd; /* backing file fd. -1 if unset. */
+ GArray *packet_index; /* contains struct packet_index */
+
+ /* Current position */
+ off_t mmap_offset; /* mmap offset in the file, in bytes */
+ size_t packet_size; /* current packet size, in bits */
+ size_t content_size; /* current content size, in bits */
+ char *base; /* mmap base address */
+ size_t offset; /* offset from base, in bits */
+
+ int dummy; /* dummy position, for length calculation */
+};
+
/*
* IMPORTANT: All lengths (len) and offsets (start, end) are expressed in bits,
* *not* in bytes.
*/
uint64_t ctf_uint_read(struct stream_pos *pos,
- const struct type_class_integer *int_class);
+ const struct declaration_integer *integer_declaration);
int64_t ctf_int_read(struct stream_pos *pos,
- const struct type_class_integer *int_class);
+ const struct declaration_integer *integer_declaration);
void ctf_uint_write(struct stream_pos *pos,
- const struct type_class_integer *int_class,
+ const struct declaration_integer *integer_declaration,
uint64_t v);
void ctf_int_write(struct stream_pos *pos,
- const struct type_class_integer *int_class,
+ const struct declaration_integer *integer_declaration,
int64_t v);
double ctf_double_read(struct stream_pos *pos,
- const struct type_class_float *src);
+ const struct declaration_float *src);
void ctf_double_write(struct stream_pos *pos,
- const struct type_class_float *dest,
+ const struct declaration_float *dest,
double v);
long double ctf_ldouble_read(struct stream_pos *pos,
- const struct type_class_float *src);
+ const struct declaration_float *src);
void ctf_ldouble_write(struct stream_pos *pos,
- const struct type_class_float *dest,
+ const struct declaration_float *dest,
long double v);
void ctf_float_copy(struct stream_pos *destp,
struct stream_pos *srcp,
- const struct type_class_float *float_class);
+ const struct declaration_float *float_declaration);
void ctf_string_copy(struct stream_pos *dest, struct stream_pos *src,
- const struct type_class_string *string_class);
-void ctf_string_read(unsigned char **dest, struct stream_pos *src,
- const struct type_class_string *string_class);
-void ctf_string_write(struct stream_pos *dest, const unsigned char *src,
- const struct type_class_string *string_class);
-void ctf_string_free_temp(unsigned char *string);
-
-GQuark ctf_enum_read(struct stream_pos *pos,
- const struct type_class_enum *src);
+ const struct declaration_string *string_declaration);
+void ctf_string_read(char **dest, struct stream_pos *src,
+ const struct declaration_string *string_declaration);
+void ctf_string_write(struct stream_pos *dest, const char *src,
+ const struct declaration_string *string_declaration);
+void ctf_string_free_temp(char *string);
+
+GArray *ctf_enum_read(struct stream_pos *pos,
+ const struct declaration_enum *src);
void ctf_enum_write(struct stream_pos *pos,
- const struct type_class_enum *dest,
+ const struct declaration_enum *dest,
GQuark q);
void ctf_struct_begin(struct stream_pos *pos,
- const struct type_class_struct *struct_class);
+ const struct declaration_struct *struct_declaration);
void ctf_struct_end(struct stream_pos *pos,
- const struct type_class_struct *struct_class);
+ const struct declaration_struct *struct_declaration);
+void ctf_variant_begin(struct stream_pos *pos,
+ const struct declaration_variant *variant_declaration);
+void ctf_variant_end(struct stream_pos *pos,
+ const struct declaration_variant *variant_declaration);
void ctf_array_begin(struct stream_pos *pos,
- const struct type_class_array *array_class);
+ const struct declaration_array *array_declaration);
void ctf_array_end(struct stream_pos *pos,
- const struct type_class_array *array_class);
+ const struct declaration_array *array_declaration);
void ctf_sequence_begin(struct stream_pos *pos,
- const struct type_class_sequence *sequence_class);
+ const struct declaration_sequence *sequence_declaration);
void ctf_sequence_end(struct stream_pos *pos,
- const struct type_class_sequence *sequence_class);
+ const struct declaration_sequence *sequence_declaration);
+
+void move_pos_slow(struct stream_pos *pos, size_t offset);
+
+static inline
+void init_pos(struct stream_pos *pos, int fd)
+{
+ pos->fd = fd;
+ pos->mmap_offset = 0;
+ pos->packet_size = 0;
+ pos->content_size = 0;
+ pos->base = NULL;
+ pos->offset = 0;
+ pos->dummy = false;
+}
+
+/*
+ * move_pos - move position of a relative bit offset
+ *
+ * TODO: allow larger files by updating base too.
+ */
+static inline
+void move_pos(struct stream_pos *pos, size_t offset)
+{
+ if (pos->fd >= 0 && pos->offset + offset >= pos->content_size)
+ move_pos_slow(pos, offset);
+ else
+ pos->offset += offset;
+}
+
+/*
+ * align_pos - align position on a bit offset (> 0)
+ *
+ * TODO: allow larger files by updating base too.
+ */
+static inline
+void align_pos(struct stream_pos *pos, size_t offset)
+{
+ pos->offset += offset_align(pos->offset, offset);
+}
+
+static inline
+void copy_pos(struct stream_pos *dest, struct stream_pos *src)
+{
+ memcpy(dest, src, sizeof(struct stream_pos));
+}
+
+static inline
+char *get_pos_addr(struct stream_pos *pos)
+{
+ /* Only makes sense to get the address after aligning on CHAR_BIT */
+ assert(!(pos->offset % CHAR_BIT));
+ return pos->base + (pos->offset / CHAR_BIT);
+}
#endif /* _BABELTRACE_CTF_TYPES_H */