Fix: support 64-bit events discarded counter types
[babeltrace.git] / formats / ctf / ctf.c
index 1e4e491d2f55e9635db2c004f1e72662b172864c..07966632e82caa99139f20458faf7f3d99f87449 100644 (file)
@@ -594,7 +594,7 @@ void ctf_packet_seek(struct stream_pos *stream_pos, size_t index, int whence)
                switch (whence) {
                case SEEK_CUR:
                {
-                       uint32_t events_discarded_diff;
+                       uint64_t events_discarded_diff;
 
                        if (pos->offset == EOF) {
                                return;
@@ -610,6 +610,13 @@ void ctf_packet_seek(struct stream_pos *stream_pos, size_t index, int whence)
                                                struct packet_index,
                                                pos->cur_index - 1);
                                events_discarded_diff -= packet_index->events_discarded;
+                               /*
+                                * Deal with 32-bit wrap-around if the
+                                * tracer provided a 32-bit field.
+                                */
+                               if (packet_index->events_discarded_len == 32) {
+                                       events_discarded_diff = (uint32_t) events_discarded_diff;
+                               }
                        }
                        file_stream->parent.events_discarded = events_discarded_diff;
                        file_stream->parent.prev_timestamp = file_stream->parent.timestamp;
@@ -643,14 +650,14 @@ void ctf_packet_seek(struct stream_pos *stream_pos, size_t index, int whence)
                                 */
                                if ((&file_stream->parent)->stream_class->trace->collection) {
                                        fflush(stdout);
-                                       fprintf(stderr, "[warning] Tracer discarded %d events at end of stream between [",
+                                       fprintf(stderr, "[warning] Tracer discarded %" PRIu64 " events at end of stream between [",
                                                        file_stream->parent.events_discarded);
                                        ctf_print_timestamp(stderr, &file_stream->parent,
                                                        file_stream->parent.prev_timestamp);
                                        fprintf(stderr, "] and [");
                                        ctf_print_timestamp(stderr, &file_stream->parent,
                                                        file_stream->parent.prev_timestamp_end);
-                                       fprintf(stderr, "]. You should consider increasing the buffer size.\n");
+                                       fprintf(stderr, "]. You should consider recording a new trace with larger buffers or with fewer events enabled.\n");
                                        fflush(stderr);
                                }
                                file_stream->parent.events_discarded = 0;
@@ -983,7 +990,8 @@ end:
        ctf_scanner_free(scanner);
 end_scanner_alloc:
 end_packet_read:
-       fclose(fp);
+       if (fp)
+               fclose(fp);
        free(buf);
 end_stream:
        close(metadata_stream->pos.fd);
@@ -1295,6 +1303,7 @@ int create_stream_packet_index(struct ctf_trace *td,
 
                                field = struct_definition_get_field_from_index(file_stream->parent.stream_packet_context, len_index);
                                packet_index.events_discarded = get_unsigned_int(field);
+                               packet_index.events_discarded_len = get_int_len(field);
                        }
                } else {
                        /* Use file size for packet size */
@@ -1425,14 +1434,14 @@ int ctf_open_trace_read(struct ctf_trace *td,
        /* Open trace directory */
        td->dir = opendir(path);
        if (!td->dir) {
-               fprintf(stderr, "[error] Unable to open trace directory.\n");
+               fprintf(stderr, "[error] Unable to open trace directory \"%s\".\n", path);
                ret = -ENOENT;
                goto error;
        }
 
        td->dirfd = open(path, 0);
        if (td->dirfd < 0) {
-               fprintf(stderr, "[error] Unable to open trace directory file descriptor.\n");
+               fprintf(stderr, "[error] Unable to open trace directory file descriptor for path \"%s\".\n", path);
                perror("Trace directory open");
                ret = -errno;
                goto error_dirfd;
@@ -1446,6 +1455,7 @@ int ctf_open_trace_read(struct ctf_trace *td,
 
        ret = ctf_open_trace_metadata_read(td, packet_seek, metadata_fp);
        if (ret) {
+               fprintf(stderr, "[warning] Unable to open trace metadata for path \"%s\".\n", path);
                goto error_metadata;
        }
 
This page took 0.024148 seconds and 4 git commands to generate.