From e7a4393bc8bd4ac95ce121b34d932620ebc386cd Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=A9mie=20Galarneau?= Date: Tue, 11 Oct 2016 03:54:00 -0400 Subject: [PATCH] allow multiple ctf streams to be open MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérémie Galarneau --- plugins/ctf/common/notif-iter/notif-iter.c | 4 +- plugins/ctf/fs/data-stream.c | 115 ++------------------- plugins/ctf/fs/data-stream.h | 6 +- plugins/ctf/fs/file.c | 3 + plugins/ctf/fs/fs.c | 102 +++++++++++++++++- plugins/ctf/fs/fs.h | 6 +- 6 files changed, 115 insertions(+), 121 deletions(-) diff --git a/plugins/ctf/common/notif-iter/notif-iter.c b/plugins/ctf/common/notif-iter/notif-iter.c index b9c450b4..9c6134f9 100644 --- a/plugins/ctf/common/notif-iter/notif-iter.c +++ b/plugins/ctf/common/notif-iter/notif-iter.c @@ -169,10 +169,10 @@ struct bt_ctf_notif_iter { } medium; /* Current packet size (bits) (-1 if unknown) */ - size_t cur_packet_size; + int64_t cur_packet_size; /* Current content size (bits) (-1 if unknown) */ - size_t cur_content_size; + int64_t cur_content_size; }; static diff --git a/plugins/ctf/fs/data-stream.c b/plugins/ctf/fs/data-stream.c index 704e4f64..4c3ab29a 100644 --- a/plugins/ctf/fs/data-stream.c +++ b/plugins/ctf/fs/data-stream.c @@ -41,7 +41,8 @@ #define PRINT_PREFIX "ctf-fs-data-stream" #include "print.h" -static void ctf_fs_stream_destroy(struct ctf_fs_stream *stream) +BT_HIDDEN +void ctf_fs_stream_destroy(struct ctf_fs_stream *stream) { if (stream->file) { ctf_fs_file_destroy(stream->file); @@ -192,7 +193,8 @@ static struct bt_ctf_notif_iter_medium_ops medops = { .get_stream = medop_get_stream, }; -static struct ctf_fs_stream *ctf_fs_stream_create( +BT_HIDDEN +struct ctf_fs_stream *ctf_fs_stream_create( struct ctf_fs_component *ctf_fs, struct ctf_fs_file *file) { struct ctf_fs_stream *stream = g_new0(struct ctf_fs_stream, 1); @@ -203,11 +205,11 @@ static struct ctf_fs_stream *ctf_fs_stream_create( stream->file = file; stream->notif_iter = bt_ctf_notif_iter_create(ctf_fs->metadata.trace, - 12, medops, stream, ctf_fs->error_fp); + ctf_fs->page_size, medops, stream, ctf_fs->error_fp); if (!stream->notif_iter) { goto error; } - stream->mmap_len = ctf_fs->page_size; + stream->mmap_len = ctf_fs->page_size * 2048; goto end; error: /* Do not touch "borrowed" file. */ @@ -218,108 +220,6 @@ end: return stream; } -int ctf_fs_data_stream_open_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. */ - stream = ctf_fs_stream_create(ctf_fs, file); - if (!stream) { - ctf_fs_file_destroy(file); - goto error; - } - - /* Append file to the array of files. */ - g_ptr_array_add(ctf_fs->data_stream.streams, stream); - } - - goto end; -error: - ret = -1; -end: - if (dir) { - g_dir_close(dir); - dir = NULL; - } - if (error) { - g_error_free(error); - } - return ret; -} - -int ctf_fs_data_stream_init(struct ctf_fs_component *ctf_fs, - struct ctf_fs_data_stream *data_stream) -{ - int ret = 0; - - data_stream->streams = g_ptr_array_new_with_free_func( - (GDestroyNotify) ctf_fs_stream_destroy); - if (!data_stream->streams) { - PERR("Cannot allocate array of streams\n"); - goto error; - } - - goto end; -error: - ret = -1; -end: - return ret; -} - -void ctf_fs_data_stream_fini(struct ctf_fs_data_stream *data_stream) -{ - g_ptr_array_free(data_stream->streams, TRUE); -} - enum bt_notification_iterator_status ctf_fs_data_stream_get_next_notification( struct ctf_fs_component *ctf_fs, struct bt_notification **notification) @@ -327,8 +227,7 @@ enum bt_notification_iterator_status ctf_fs_data_stream_get_next_notification( enum bt_ctf_notif_iter_status status; enum bt_notification_iterator_status ret; /* FIXME, only iterating on one stream for the moment. */ - struct ctf_fs_stream *stream = g_ptr_array_index( - ctf_fs->data_stream.streams, 0); + struct ctf_fs_stream *stream = g_ptr_array_index(ctf_fs->streams, 0); if (stream->end_reached) { status = BT_CTF_NOTIF_ITER_STATUS_EOF; diff --git a/plugins/ctf/fs/data-stream.h b/plugins/ctf/fs/data-stream.h index 23666814..d6bb97fc 100644 --- a/plugins/ctf/fs/data-stream.h +++ b/plugins/ctf/fs/data-stream.h @@ -31,11 +31,11 @@ #include "../common/notif-iter/notif-iter.h" BT_HIDDEN -int ctf_fs_data_stream_init(struct ctf_fs_component *ctf_fs, - struct ctf_fs_data_stream *data_stream); +struct ctf_fs_stream *ctf_fs_stream_create( + struct ctf_fs_component *ctf_fs, struct ctf_fs_file *file); BT_HIDDEN -void ctf_fs_data_stream_fini(struct ctf_fs_data_stream *data_stream); +void ctf_fs_stream_destroy(struct ctf_fs_stream *stream); BT_HIDDEN int ctf_fs_data_stream_open_streams(struct ctf_fs_component *ctf_fs); diff --git a/plugins/ctf/fs/file.c b/plugins/ctf/fs/file.c index 54b11a67..c0ca3b8d 100644 --- a/plugins/ctf/fs/file.c +++ b/plugins/ctf/fs/file.c @@ -32,6 +32,7 @@ #include "file.h" +BT_HIDDEN void ctf_fs_file_destroy(struct ctf_fs_file *file) { struct ctf_fs_component *ctf_fs = file->ctf_fs; @@ -56,6 +57,7 @@ void ctf_fs_file_destroy(struct ctf_fs_file *file) g_free(file); } +BT_HIDDEN struct ctf_fs_file *ctf_fs_file_create(struct ctf_fs_component *ctf_fs) { struct ctf_fs_file *file = g_new0(struct ctf_fs_file, 1); @@ -80,6 +82,7 @@ end: return file; } +BT_HIDDEN int ctf_fs_file_open(struct ctf_fs_component *ctf_fs, struct ctf_fs_file *file, const char *mode) { diff --git a/plugins/ctf/fs/fs.c b/plugins/ctf/fs/fs.c index b80e4e15..0c6f3d8d 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; @@ -155,8 +160,8 @@ 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); + g_ptr_array_free(component->streams, TRUE); g_free(component); } @@ -168,6 +173,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) { @@ -197,15 +286,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; diff --git a/plugins/ctf/fs/fs.h b/plugins/ctf/fs/fs.h index f4bd86c9..151e28ed 100644 --- a/plugins/ctf/fs/fs.h +++ b/plugins/ctf/fs/fs.h @@ -66,10 +66,6 @@ struct ctf_fs_stream { bool end_reached; }; -struct ctf_fs_data_stream { - GPtrArray *streams; -}; - struct ctf_fs_iterator { struct bt_notification_heap *pending_notifications; }; @@ -84,8 +80,8 @@ struct ctf_fs_component { size_t page_size; struct bt_notification *current_notification; struct ctf_fs_metadata metadata; - struct ctf_fs_data_stream data_stream; struct ctf_fs_component_options options; + GPtrArray *streams; /* struct ctf_fs_data_stream * */ }; BT_HIDDEN -- 2.34.1