X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=plugins%2Fctf%2Ffs%2Ffs.c;h=bf834f3fe4dd1a804a9ddfadb045e671ea224b84;hb=fc9a526c0ed9aed1c1c54698add871ade855175c;hp=bcaf4d5ab6df61d02774045b9ae76cd624705e6f;hpb=7aeb43bf623770a9ff12324337136c1877f7bbf0;p=babeltrace.git diff --git a/plugins/ctf/fs/fs.c b/plugins/ctf/fs/fs.c index bcaf4d5a..bf834f3f 100644 --- a/plugins/ctf/fs/fs.c +++ b/plugins/ctf/fs/fs.c @@ -34,6 +34,11 @@ #include "fs.h" #include "metadata.h" #include "data-stream.h" +#include "file.h" + +#define PRINT_ERR_STREAM ctf_fs->error_fp +#define PRINT_PREFIX "ctf-fs" +#include "print.h" static bool ctf_fs_debug; @@ -57,6 +62,7 @@ struct bt_notification *ctf_fs_iterator_get( notification = bt_get(ctf_fs->current_notification); end: + BT_PUT(component); return notification; } @@ -65,8 +71,7 @@ enum bt_notification_iterator_status ctf_fs_iterator_next( struct bt_notification_iterator *iterator) { enum bt_notification_iterator_status ret; - struct bt_ctf_notif_iter_notif *notification; -// struct bt_notification *notification = NULL; + struct bt_notification *notification = NULL; struct ctf_fs_component *ctf_fs; struct bt_component *component = bt_notification_iterator_get_component( iterator); @@ -79,35 +84,15 @@ enum bt_notification_iterator_status ctf_fs_iterator_next( ctf_fs = bt_component_get_private_data(component); assert(ctf_fs); - ret = ctf_fs_data_stream_get_next_notification(ctf_fs, ¬ification); + ret = ctf_fs_data_stream_get_next_notification(ctf_fs, ¬ification, 0); if (ret || !notification) { goto end; } - switch (notification->type) { - case BT_CTF_NOTIF_ITER_NOTIF_NEW_PACKET: - { - struct bt_ctf_notif_iter_notif_new_packet *notif = - (struct bt_ctf_notif_iter_notif_new_packet *) notification; - break; - } - case BT_CTF_NOTIF_ITER_NOTIF_EVENT: - { - struct bt_ctf_notif_iter_notif_event *notif = - (struct bt_ctf_notif_iter_notif_event *) notification; - break; - } - case BT_CTF_NOTIF_ITER_NOTIF_END_OF_PACKET: - { - struct bt_ctf_notif_iter_notif_end_of_packet *notif = - (struct bt_ctf_notif_iter_notif_end_of_packet *) notification; - break; - } - default: - break; - } - + bt_put(ctf_fs->current_notification); + ctf_fs->current_notification = notification; end: + BT_PUT(component); return ret; } @@ -175,8 +160,10 @@ void ctf_fs_destroy_data(struct ctf_fs_component *component) } ctf_fs_metadata_fini(&component->metadata); - ctf_fs_data_stream_fini(&component->data_stream); BT_PUT(component->current_notification); + if (component->streams) { + g_ptr_array_free(component->streams, TRUE); + } g_free(component); } @@ -188,6 +175,90 @@ void ctf_fs_destroy(struct bt_component *component) ctf_fs_destroy_data(data); } +static +int open_trace_streams(struct ctf_fs_component *ctf_fs) +{ + int ret = 0; + const char *name; + GError *error = NULL; + GDir *dir = g_dir_open(ctf_fs->trace_path->str, 0, &error); + + if (!dir) { + PERR("Cannot open directory \"%s\": %s (code %d)\n", + ctf_fs->trace_path->str, error->message, + error->code); + goto error; + } + + while ((name = g_dir_read_name(dir))) { + struct ctf_fs_file *file = NULL; + struct ctf_fs_stream *stream = NULL; + + if (!strcmp(name, CTF_FS_METADATA_FILENAME)) { + /* Ignore the metadata stream. */ + PDBG("Ignoring metadata file \"%s\"\n", + name); + continue; + } + + if (name[0] == '.') { + PDBG("Ignoring hidden file \"%s\"\n", + name); + continue; + } + + /* Create the file. */ + file = ctf_fs_file_create(ctf_fs); + if (!file) { + PERR("Cannot create stream file object\n"); + goto error; + } + + /* Create full path string. */ + g_string_append_printf(file->path, "%s/%s", + ctf_fs->trace_path->str, name); + if (!g_file_test(file->path->str, G_FILE_TEST_IS_REGULAR)) { + PDBG("Ignoring non-regular file \"%s\"\n", name); + ctf_fs_file_destroy(file); + continue; + } + + /* Open the file. */ + if (ctf_fs_file_open(ctf_fs, file, "rb")) { + ctf_fs_file_destroy(file); + goto error; + } + + /* Create a private stream; file ownership is passed to it. */ + stream = ctf_fs_stream_create(ctf_fs, file); + if (!stream) { + ctf_fs_file_destroy(file); + goto error; + } + + g_ptr_array_add(ctf_fs->streams, stream); + } + + goto end; +error: + ret = -1; +end: + if (dir) { + g_dir_close(dir); + dir = NULL; + } + if (error) { + g_error_free(error); + } + return ret; +} + +static +void stream_destroy(void *stream) +{ + ctf_fs_stream_destroy((struct ctf_fs_stream *) stream); +} + static struct ctf_fs_component *ctf_fs_create(struct bt_value *params) { @@ -217,15 +288,22 @@ struct ctf_fs_component *ctf_fs_create(struct bt_value *params) goto error; } + ctf_fs->streams = g_ptr_array_new_with_free_func(stream_destroy); ctf_fs->error_fp = stderr; ctf_fs->page_size = (size_t) getpagesize(); - ctf_fs_data_stream_init(ctf_fs, &ctf_fs->data_stream); + + // FIXME: check error. ctf_fs_metadata_set_trace(ctf_fs); - ctf_fs_data_stream_open_streams(ctf_fs); + + ret = open_trace_streams(ctf_fs); + if (ret) { + goto error; + } goto end; error: ctf_fs_destroy_data(ctf_fs); + ctf_fs = NULL; end: BT_PUT(value); return ctf_fs; @@ -261,7 +339,6 @@ enum bt_component_status ctf_fs_init(struct bt_component *source, if (ret != BT_COMPONENT_STATUS_OK) { goto error; } - end: return ret; error: