X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=formats%2Fctf%2Fctf.c;h=80bd37869ed897f947c1b99e3f871b3d93d9692d;hp=ab4945dddcff18b8c41c6df91798096b4940695b;hb=25ccc85ba8fce5fb8402f1c6fc63a75ff7f07d99;hpb=0716bb06f1a2995aedf7df46b0ed00a126fc8f29 diff --git a/formats/ctf/ctf.c b/formats/ctf/ctf.c index ab4945dd..80bd3786 100644 --- a/formats/ctf/ctf.c +++ b/formats/ctf/ctf.c @@ -64,7 +64,7 @@ uint64_t opt_clock_offset; extern int yydebug; static -struct trace_descriptor *ctf_open_trace(const char *collection_path, const char *path, int flags, +struct trace_descriptor *ctf_open_trace(const char *path, int flags, void (*move_pos_slow)(struct ctf_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) { @@ -1249,6 +1261,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,97 +1284,8 @@ 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, int whence), FILE *metadata_fp) @@ -1367,7 +1294,6 @@ int ctf_open_trace_read(struct ctf_trace *td, const char *collection_path, struct dirent *dirent; struct dirent *diriter; size_t dirent_len; - char *respath, *rescolpath; td->flags = flags; @@ -1386,19 +1312,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,7 +1369,7 @@ error: } static -struct trace_descriptor *ctf_open_trace(const char *collection_path, const char *path, int flags, +struct trace_descriptor *ctf_open_trace(const char *path, int flags, void (*move_pos_slow)(struct ctf_stream_pos *pos, size_t offset, int whence), FILE *metadata_fp) { @@ -1469,7 +1384,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;