From: Simon Marchi <[email protected]> The format plugins should implement this callback to tell whether they are interested (capable) in processing the given path or not. This allows to move CTF-specific code from the core to ctf.c. This should be a step towards having more than one input plugin.
The callback should return 1 if it wants to handle this path, 0 otherwise. It also return 0 in case of catastrophic failure. Signed-off-by: Simon Marchi <[email protected]> --- converter/babeltrace.c | 73 ++++++++++++++++++++------------------------- formats/ctf/ctf.c | 50 +++++++++++++++++++++++++++++++ include/babeltrace/format.h | 1 + 3 files changed, 84 insertions(+), 40 deletions(-) Hellooooo, There is a little problem with babeltrace currently, which is that the core of the converter contains CTF-specific code, in particular in the recursive trace adding code. What the traverse_trace_dir function does is simply tell whether a certain path looks like a CTF trace. The solution I see is to move that code in the plugins by having a callback through which the plugin can tell us if a given path is interesting for him. I am notoriously bad at naming stuff, so I'd be happy if you found a better clear name for the callback. Thanks, Simon diff --git a/converter/babeltrace.c b/converter/babeltrace.c index d5a7040..7489f35 100644 --- a/converter/babeltrace.c +++ b/converter/babeltrace.c @@ -416,6 +416,11 @@ end: return ret; } +/* + * Oh noes! Since nftw doesn't pass a user data pointer to its callbacks, we + * have to resort to global variables. + */ +static struct bt_format *traverse_trace_dir_format = NULL; static GPtrArray *traversed_paths = 0; /* @@ -429,53 +434,32 @@ static GPtrArray *traversed_paths = 0; static int traverse_trace_dir(const char *fpath, const struct stat *sb, int tflag, struct FTW *ftwbuf) { - int dirfd, metafd; - int closeret; + int ret; - if (tflag != FTW_D) - return 0; + assert(traverse_trace_dir_format != NULL); + assert(traversed_paths != NULL); - dirfd = open(fpath, 0); - if (dirfd < 0) { - fprintf(stderr, "[error] [Context] Unable to open trace " - "directory file descriptor.\n"); - return 0; /* partial error */ + if (!traverse_trace_dir_format->shows_interest) { + /* Mr plug-in, if you don't implement the shows_interest callback, how + * should we know if you are interested in a path? */ + return -1; } - metafd = openat(dirfd, "metadata", O_RDONLY); - if (metafd < 0) { - closeret = close(dirfd); - if (closeret < 0) { - perror("close"); - return -1; - } - /* No meta data, just return */ - return 0; - } else { - int err_close = 0; - closeret = close(metafd); - if (closeret < 0) { - perror("close"); - err_close = 1; - } - closeret = close(dirfd); - if (closeret < 0) { - perror("close"); - err_close = 1; - } - if (err_close) { - return -1; - } + ret = traverse_trace_dir_format->shows_interest(fpath, tflag == FTW_D); - /* Add path to the global list */ - if (traversed_paths == NULL) { - fprintf(stderr, "[error] [Context] Invalid open path array.\n"); - return -1; - } + /* + * If ret is negative (means error), we return directly. This will + * interrupt the file tree walk. If ret is 0, the format is not interested + * by the path, we also return directly. + */ + + if (ret > 0) { + /* Format is interested. Add path to the global list */ g_ptr_array_add(traversed_paths, g_string_new(fpath)); + ret = 0; } - return 0; + return ret; } /* @@ -499,7 +483,14 @@ int bt_context_add_traces_recursive(struct bt_context *ctx, const char *path, /* Should lock traversed_paths mutex here if used in multithread */ + struct bt_format *format = bt_lookup_format(g_quark_from_string(format_str)); + if (!format) { + ret = -1; + goto error; + } + traversed_paths = g_ptr_array_new(); + traverse_trace_dir_format = format; ret = nftw(path, traverse_trace_dir, 10, 0); /* Process the array if ntfw did not return a fatal error */ @@ -539,6 +530,8 @@ int bt_context_add_traces_recursive(struct bt_context *ctx, const char *path, fprintf(stderr, "[error] Cannot open any trace for reading.\n\n"); ret = -ENOENT; /* failure */ } + +error: return ret; } @@ -697,7 +690,7 @@ int main(int argc, char **argv) } } fmt_read = bt_lookup_format(g_quark_from_static_string(opt_input_format)); - if (!fmt_read || fmt_read->name != g_quark_from_static_string("ctf")) { + if (!fmt_read) { fprintf(stderr, "[error] Format \"%s\" is not supported.\n\n", opt_input_format); partial_error = 1; diff --git a/formats/ctf/ctf.c b/formats/ctf/ctf.c index 947b439..e6babc1 100644 --- a/formats/ctf/ctf.c +++ b/formats/ctf/ctf.c @@ -111,6 +111,9 @@ static int ctf_convert_index_timestamp(struct bt_trace_descriptor *tdp); static +int ctf_shows_interest(const char *fpath, int is_dir); + +static rw_dispatch read_dispatch_table[] = { [ CTF_TYPE_INTEGER ] = ctf_integer_read, [ CTF_TYPE_FLOAT ] = ctf_float_read, @@ -144,6 +147,7 @@ struct bt_format ctf_format = { .timestamp_begin = ctf_timestamp_begin, .timestamp_end = ctf_timestamp_end, .convert_index_timestamp = ctf_convert_index_timestamp, + .shows_interest = ctf_shows_interest, }; static @@ -2095,6 +2099,52 @@ int ctf_convert_index_timestamp(struct bt_trace_descriptor *tdp) } static +int ctf_shows_interest(const char *fpath, int is_dir) +{ + int dirfd, metafd; + int closeret; + + if (!is_dir) + return 0; + + dirfd = open(fpath, 0); + if (dirfd < 0) { + fprintf(stderr, "[error] [Context] Unable to open trace " + "directory file descriptor.\n"); + return 0; /* partial error */ + } + metafd = openat(dirfd, "metadata", O_RDONLY); + if (metafd < 0) { + closeret = close(dirfd); + if (closeret < 0) { + perror("close"); + return -1; + } + /* No meta data, just return */ + return 0; + } else { + int err_close = 0; + + closeret = close(metafd); + if (closeret < 0) { + perror("close"); + err_close = 1; + } + closeret = close(dirfd); + if (closeret < 0) { + perror("close"); + err_close = 1; + } + if (err_close) { + return -1; + } + } + + /* This path is interesting. */ + return 1; +} + +static int ctf_close_file_stream(struct ctf_file_stream *file_stream) { int ret; diff --git a/include/babeltrace/format.h b/include/babeltrace/format.h index 07e854f..b039abc 100644 --- a/include/babeltrace/format.h +++ b/include/babeltrace/format.h @@ -77,6 +77,7 @@ struct bt_format { uint64_t (*timestamp_end)(struct bt_trace_descriptor *descriptor, struct bt_trace_handle *handle, enum bt_clock_type type); int (*convert_index_timestamp)(struct bt_trace_descriptor *descriptor); + int (*shows_interest)(const char *path, int is_dir); }; extern struct bt_format *bt_lookup_format(bt_intern_str qname); -- 1.8.3.2 _______________________________________________ lttng-dev mailing list [email protected] http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
