Fix: handle packet_seek errors
[babeltrace.git] / include / babeltrace / ctf / types.h
index 67b24ee4aa940cf3185bff55c57c2a127b2f2904..59ce99811f73993457ffdd9aacff7d2d73e1b691 100644 (file)
@@ -39,6 +39,7 @@
 #include <stdio.h>
 #include <inttypes.h>
 #include <babeltrace/mmap-align.h>
+#include <babeltrace/error.h>
 
 #define LAST_OFFSET_POISON     ((int64_t) ~0ULL)
 
@@ -58,6 +59,9 @@ struct packet_index {
        uint64_t events_discarded_len;  /* length of the field, in bits */
        struct packet_index_time ts_cycles;     /* timestamp in cycles */
        struct packet_index_time ts_real;       /* realtime timestamp */
+       /* CTF_INDEX 1.0 limit */
+       uint64_t stream_instance_id;    /* ID of the channel instance */
+       uint64_t packet_seq_num;        /* packet sequence number */
 };
 
 /*
@@ -132,6 +136,28 @@ int ctf_init_pos(struct ctf_stream_pos *pos, struct bt_trace_descriptor *trace,
                int fd, int open_flags);
 int ctf_fini_pos(struct ctf_stream_pos *pos);
 
+static inline
+int ctf_pos_access_ok(struct ctf_stream_pos *pos, uint64_t bit_len)
+{
+       uint64_t max_len;
+
+       if (unlikely(pos->offset == EOF))
+               return 0;
+       if (pos->prot == PROT_READ) {
+               /*
+                * Reads may only reach up to the "content_size",
+                * regardless of the packet_size.
+                */
+               max_len = pos->content_size;
+       } else {
+               /* Writes may take place up to the end of the packet. */
+               max_len = pos->packet_size;
+       }
+       if (unlikely(pos->offset + bit_len > max_len))
+               return 0;
+       return 1;
+}
+
 /*
  * move_pos - move position of a relative bit offset
  *
@@ -142,21 +168,17 @@ int ctf_fini_pos(struct ctf_stream_pos *pos);
 static inline
 int ctf_move_pos(struct ctf_stream_pos *pos, uint64_t bit_offset)
 {
-       uint64_t max_len;
+       int ret = 0;
 
        printf_debug("ctf_move_pos test EOF: %" PRId64 "\n", pos->offset);
-       if (unlikely(pos->offset == EOF))
-               return 0;
-       if (pos->prot == PROT_READ)
-               max_len = pos->content_size;
-       else
-               max_len = pos->packet_size;
-       if (unlikely(pos->offset + bit_offset > max_len))
-               return 0;
-
+       ret = ctf_pos_access_ok(pos, bit_offset);
+       if (!ret) {
+               goto end;
+       }
        pos->offset += bit_offset;
        printf_debug("ctf_move_pos after increment: %" PRId64 "\n", pos->offset);
-       return 1;
+end:
+       return ret;
 }
 
 /*
@@ -202,25 +224,10 @@ int ctf_pos_packet(struct ctf_stream_pos *dummy)
 }
 
 static inline
-void ctf_pos_pad_packet(struct ctf_stream_pos *pos)
+int ctf_pos_pad_packet(struct ctf_stream_pos *pos)
 {
        ctf_packet_seek(&pos->parent, 0, SEEK_CUR);
-}
-
-static inline
-int ctf_pos_access_ok(struct ctf_stream_pos *pos, uint64_t bit_len)
-{
-       uint64_t max_len;
-
-       if (unlikely(pos->offset == EOF))
-               return 0;
-       if (pos->prot == PROT_READ)
-               max_len = pos->content_size;
-       else
-               max_len = pos->packet_size;
-       if (unlikely(pos->offset + bit_len > max_len))
-               return 0;
-       return 1;
+       return bt_packet_seek_get_error();
 }
 
 /*
@@ -228,8 +235,10 @@ int ctf_pos_access_ok(struct ctf_stream_pos *pos, uint64_t bit_len)
  * the next packet if we are located at the end of the current packet.
  */
 static inline
-void ctf_pos_get_event(struct ctf_stream_pos *pos)
+int ctf_pos_get_event(struct ctf_stream_pos *pos)
 {
+       int ret = 0;
+
        assert(pos->offset <= pos->content_size);
        if (pos->offset == pos->content_size) {
                printf_debug("ctf_packet_seek (before call): %" PRId64 "\n",
@@ -237,12 +246,15 @@ void ctf_pos_get_event(struct ctf_stream_pos *pos)
                pos->packet_seek(&pos->parent, 0, SEEK_CUR);
                printf_debug("ctf_packet_seek (after call): %" PRId64 "\n",
                             pos->offset);
+               ret = bt_packet_seek_get_error();
        }
+       return ret;
 }
 
 void ctf_print_timestamp(FILE *fp, struct ctf_stream_definition *stream,
                        uint64_t timestamp);
 int ctf_append_trace_metadata(struct bt_trace_descriptor *tdp,
                        FILE *metadata_fp);
+void ctf_print_discarded_lost(FILE *fp, struct ctf_stream_definition *stream);
 
 #endif /* _BABELTRACE_CTF_TYPES_H */
This page took 0.026084 seconds and 4 git commands to generate.