Fix: do not use ctf-specific struct in format.h
[babeltrace.git] / formats / ctf / ctf.c
index ab4945dddcff18b8c41c6df91798096b4940695b..8d617bcd620f66b8576a7a40ad2dd01f9f89ad44 100644 (file)
@@ -64,13 +64,13 @@ uint64_t opt_clock_offset;
 extern int yydebug;
 
 static
-struct trace_descriptor *ctf_open_trace(const char *collection_path, const char *path, int flags,
-               void (*move_pos_slow)(struct ctf_stream_pos *pos, size_t offset,
+struct trace_descriptor *ctf_open_trace(const char *path, int flags,
+               void (*move_pos_slow)(struct stream_pos *pos, size_t offset,
                        int whence), FILE *metadata_fp);
 static
 struct trace_descriptor *ctf_open_mmap_trace(
                struct mmap_stream_list *mmap_list,
-               void (*move_pos_slow)(struct ctf_stream_pos *pos, size_t offset, int whence),
+               void (*move_pos_slow)(struct stream_pos *pos, size_t offset, int whence),
                FILE *metadata_fp);
 
 static
@@ -107,6 +107,9 @@ struct format ctf_format = {
        .close_trace = ctf_close_trace,
 };
 
+/*
+ * Update stream current timestamp, keep at clock frequency.
+ */
 static
 void ctf_update_timestamp(struct ctf_stream *stream,
                          struct definition_integer *integer_definition)
@@ -134,6 +137,10 @@ void ctf_update_timestamp(struct ctf_stream *stream,
        stream->timestamp = updateval;
 }
 
+/*
+ * Print timestamp, rescaling clock frequency to nanoseconds and
+ * applying offsets as needed (unix time).
+ */
 void ctf_print_timestamp(FILE *fp,
                        struct ctf_stream *stream,
                        uint64_t timestamp)
@@ -143,7 +150,12 @@ void ctf_print_timestamp(FILE *fp,
        struct trace_collection *tc = trace->collection;
        uint64_t tc_offset = tc->single_clock_offset_avg;
 
-       ts_nsec = timestamp;
+       if (stream->current_clock->freq == 1000000000ULL) {
+               ts_nsec = timestamp;
+       } else {
+               ts_nsec = (uint64_t) ((double) timestamp * 1000000000.0
+                               / (double) stream->current_clock->freq);
+       }
 
        /* Add offsets */
        if (!opt_clock_raw) {
@@ -217,6 +229,11 @@ int ctf_read_event(struct stream_pos *ppos, struct ctf_stream *stream)
 
        ctf_pos_get_event(pos);
 
+       /* save the current position as a restore point */
+       pos->last_offset = pos->offset;
+       /* we just read the event, it is consumed when used by the caller */
+       stream->consumed = 0;
+
        /*
         * This is the EOF check after we've advanced the position in
         * ctf_pos_get_event.
@@ -394,7 +411,7 @@ void ctf_init_pos(struct ctf_stream_pos *pos, int fd, int open_flags)
                pos->parent.rw_table = write_dispatch_table;
                pos->parent.event_cb = ctf_write_event;
                if (fd >= 0)
-                       ctf_move_pos_slow(pos, 0, SEEK_SET);    /* position for write */
+                       ctf_move_pos_slow(&pos->parent, 0, SEEK_SET);   /* position for write */
                break;
        default:
                assert(0);
@@ -419,8 +436,10 @@ void ctf_fini_pos(struct ctf_stream_pos *pos)
        (void) g_array_free(pos->packet_index, TRUE);
 }
 
-void ctf_move_pos_slow(struct ctf_stream_pos *pos, size_t offset, int whence)
+void ctf_move_pos_slow(struct stream_pos *stream_pos, size_t offset, int whence)
 {
+       struct ctf_stream_pos *pos =
+               container_of(stream_pos, struct ctf_stream_pos, parent);
        struct ctf_file_stream *file_stream =
                container_of(pos, struct ctf_file_stream, pos);
        int ret;
@@ -495,8 +514,8 @@ void ctf_move_pos_slow(struct ctf_stream_pos *pos, size_t offset, int whence)
                        break;
                }
                case SEEK_SET:
-                       assert(offset == 0);    /* only seek supported for now */
-                       pos->cur_index = 0;
+                       if (offset == 0)
+                               pos->cur_index = 0;
                        file_stream->parent.prev_timestamp = 0;
                        file_stream->parent.prev_timestamp_end = 0;
                        break;
@@ -751,7 +770,7 @@ int ctf_open_trace_metadata_stream_read(struct ctf_trace *td, FILE **fp,
 
 static
 int ctf_open_trace_metadata_read(struct ctf_trace *td,
-               void (*move_pos_slow)(struct ctf_stream_pos *pos, size_t offset,
+               void (*move_pos_slow)(struct stream_pos *pos, size_t offset,
                        int whence), FILE *metadata_fp)
 {
        struct ctf_scanner *scanner;
@@ -1168,14 +1187,14 @@ int create_stream_packet_index(struct ctf_trace *td,
 
                /* Validate content size and packet size values */
                if (packet_index.content_size > packet_index.packet_size) {
-                       fprintf(stderr, "[error] Content size (%zu bits) is larger than packet size (%zu bits).\n",
+                       fprintf(stderr, "[error] Content size (%" PRIu64 " bits) is larger than packet size (%" PRIu64 " bits).\n",
                                packet_index.content_size, packet_index.packet_size);
                        return -EINVAL;
                }
 
-               if (packet_index.packet_size > (filestats.st_size - packet_index.offset) * CHAR_BIT) {
-                       fprintf(stderr, "[error] Packet size (%zu bits) is larger than remaining file size (%zu bits).\n",
-                               packet_index.content_size, (size_t) (filestats.st_size - packet_index.offset) * CHAR_BIT);
+               if (packet_index.packet_size > ((uint64_t)filestats.st_size - packet_index.offset) * CHAR_BIT) {
+                       fprintf(stderr, "[error] Packet size (%" PRIu64 " bits) is larger than remaining file size (%" PRIu64 " bits).\n",
+                               packet_index.content_size, ((uint64_t)filestats.st_size - packet_index.offset) * CHAR_BIT);
                        return -EINVAL;
                }
 
@@ -1189,7 +1208,7 @@ int create_stream_packet_index(struct ctf_trace *td,
        }
 
        /* Move pos back to beginning of file */
-       ctf_move_pos_slow(pos, 0, SEEK_SET);    /* position for write */
+       ctf_move_pos_slow(&pos->parent, 0, SEEK_SET);   /* position for write */
 
        return 0;
 }
@@ -1224,7 +1243,7 @@ error:
  */
 static
 int ctf_open_file_stream_read(struct ctf_trace *td, const char *path, int flags,
-               void (*move_pos_slow)(struct ctf_stream_pos *pos, size_t offset,
+               void (*move_pos_slow)(struct stream_pos *pos, size_t offset,
                        int whence))
 {
        int ret;
@@ -1249,6 +1268,10 @@ int ctf_open_file_stream_read(struct ctf_trace *td, const char *path, int flags,
        ret = create_trace_definitions(td, &file_stream->parent);
        if (ret)
                goto error_def;
+       /*
+        * For now, only a single slock is supported.
+        */
+       file_stream->parent.current_clock = td->single_clock;
        ret = create_stream_packet_index(td, file_stream);
        if (ret)
                goto error_index;
@@ -1268,106 +1291,16 @@ error:
        return ret;
 }
 
-static void
-init_domain_name(struct ctf_trace *td)
-{
-       char *start, *end;
-
-       start = td->path + strlen(td->collection_path);
-       while (start[0] == '/')
-               start++;        /* skip / */
-       end = strchr(start, '/');
-       if (!end)
-               end = start + strlen(start);
-       memcpy(td->domain, start, end - start);
-       td->domain[end - start] = '\0';
-}
-
-static void
-init_proc_name(struct ctf_trace *td)
-{
-       char buf[PATH_MAX];
-       char *start, *end;
-
-       if (td->domain[0] == '\0')
-               return;
-       memcpy(buf, td->path, PATH_MAX);
-       start = buf + strlen(td->collection_path);
-       while (start[0] == '/')
-               start++;        /* skip / */
-       start = strchr(start, '/');     /* get begin of domain content */
-       if (!start)
-               return;
-       while (start[0] == '/')
-               start++;        /* skip / */
-       /* find last -, skips time */
-       end = strrchr(start, '-');
-       if (!end)
-               return;
-       *end = '\0';
-       /* find previous -, skips date */
-       end = strrchr(start, '-');
-       if (!end)
-               return;
-       *end = '\0';
-       /* find previous -, skips pid */
-       end = strrchr(start, '-');
-       if (!end)
-               return;
-       *end = '\0';
-
-       memcpy(td->procname, start, end - start);
-       td->procname[end - start] = '\0';
-}
-
-static void
-init_vpid(struct ctf_trace *td)
-{
-       char buf[PATH_MAX];
-       char *start, *end;
-
-       if (td->domain[0] == '\0')
-               return;
-       memcpy(buf, td->path, PATH_MAX);
-       start = buf + strlen(td->collection_path);
-       while (start[0] == '/')
-               start++;        /* skip / */
-       start = strchr(start, '/');     /* get begin of domain content */
-       if (!start)
-               return;
-       while (start[0] == '/')
-               start++;        /* skip / */
-       /* find last -, skips time */
-       end = strrchr(start, '-');
-       if (!end)
-               return;
-       *end = '\0';
-       /* find previous -, skips date */
-       end = strrchr(start, '-');
-       if (!end)
-               return;
-       *end = '\0';
-       /* find previous -, skips pid */
-       start = strrchr(start, '-');
-       if (!start)
-               return;
-       start++;        /* skip - */
-
-       memcpy(td->vpid, start, end - start);
-       td->vpid[end - start] = '\0';
-}
-
 static
-int ctf_open_trace_read(struct ctf_trace *td, const char *collection_path,
+int ctf_open_trace_read(struct ctf_trace *td,
                const char *path, int flags,
-               void (*move_pos_slow)(struct ctf_stream_pos *pos, size_t offset,
+               void (*move_pos_slow)(struct stream_pos *pos, size_t offset,
                        int whence), FILE *metadata_fp)
 {
        int ret;
        struct dirent *dirent;
        struct dirent *diriter;
        size_t dirent_len;
-       char *respath, *rescolpath;
 
        td->flags = flags;
 
@@ -1386,19 +1319,8 @@ int ctf_open_trace_read(struct ctf_trace *td, const char *collection_path,
                ret = -errno;
                goto error_dirfd;
        }
-       rescolpath = realpath(collection_path, td->collection_path);
-       if (!rescolpath) {
-               fprintf(stderr, "[error] collection path resolution failure\n");
-               return -EINVAL;
-       }
-       respath = realpath(path, td->path);
-       if (!respath) {
-               fprintf(stderr, "[error] path resolution failure\n");
-               return -EINVAL;
-       }
-       init_domain_name(td);
-       init_proc_name(td);
-       init_vpid(td);
+       strncpy(td->path, path, sizeof(td->path));
+       td->path[sizeof(td->path) - 1] = '\0';
 
        /*
         * Keep the metadata file separate.
@@ -1454,8 +1376,8 @@ error:
 }
 
 static
-struct trace_descriptor *ctf_open_trace(const char *collection_path, const char *path, int flags,
-               void (*move_pos_slow)(struct ctf_stream_pos *pos, size_t offset,
+struct trace_descriptor *ctf_open_trace(const char *path, int flags,
+               void (*move_pos_slow)(struct stream_pos *pos, size_t offset,
                        int whence), FILE *metadata_fp)
 {
        struct ctf_trace *td;
@@ -1469,7 +1391,7 @@ struct trace_descriptor *ctf_open_trace(const char *collection_path, const char
                        fprintf(stderr, "[error] Path missing for input CTF trace.\n");
                        goto error;
                }
-               ret = ctf_open_trace_read(td, collection_path, path, flags, move_pos_slow, metadata_fp);
+               ret = ctf_open_trace_read(td, path, flags, move_pos_slow, metadata_fp);
                if (ret)
                        goto error;
                break;
@@ -1538,7 +1460,7 @@ end:
 static
 int ctf_open_mmap_stream_read(struct ctf_trace *td,
                struct mmap_stream *mmap_info,
-               void (*move_pos_slow)(struct ctf_stream_pos *pos, size_t offset,
+               void (*move_pos_slow)(struct stream_pos *pos, size_t offset,
                        int whence))
 {
        int ret;
@@ -1573,7 +1495,7 @@ error_def:
 
 int ctf_open_mmap_trace_read(struct ctf_trace *td,
                struct mmap_stream_list *mmap_list,
-               void (*move_pos_slow)(struct ctf_stream_pos *pos, size_t offset,
+               void (*move_pos_slow)(struct stream_pos *pos, size_t offset,
                        int whence),
                FILE *metadata_fp)
 {
@@ -1589,7 +1511,7 @@ int ctf_open_mmap_trace_read(struct ctf_trace *td,
         * for each stream, try to open, check magic number, and get the
         * stream ID to add to the right location in the stream array.
         */
-       cds_list_for_each_entry(mmap_info, &mmap_list->head, list) {
+       bt_list_for_each_entry(mmap_info, &mmap_list->head, list) {
                ret = ctf_open_mmap_stream_read(td, mmap_info, move_pos_slow);
                if (ret) {
                        fprintf(stderr, "[error] Open file mmap stream error.\n");
@@ -1606,7 +1528,7 @@ error:
 static
 struct trace_descriptor *ctf_open_mmap_trace(
                struct mmap_stream_list *mmap_list,
-               void (*move_pos_slow)(struct ctf_stream_pos *pos, size_t offset, int whence),
+               void (*move_pos_slow)(struct stream_pos *pos, size_t offset, int whence),
                FILE *metadata_fp)
 {
        struct ctf_trace *td;
This page took 0.028822 seconds and 4 git commands to generate.