From: Julien Desfossez Date: Wed, 31 May 2017 19:19:22 +0000 (-0400) Subject: fs-sink: move stream and stream_class maps in fs_writer struct X-Git-Tag: v2.0.0-pre1~68 X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=commitdiff_plain;h=a619fcb71906fd9dd9ed75c3c8d9f14ab8204637 fs-sink: move stream and stream_class maps in fs_writer struct The fs_writer struct is now responsible for those HT since they are only relevant within the scope of a writer, not the whole component. Signed-off-by: Julien Desfossez Signed-off-by: Jérémie Galarneau --- diff --git a/plugins/ctf/fs-sink/write.c b/plugins/ctf/fs-sink/write.c index 9f4fe61d..45ba3bcb 100644 --- a/plugins/ctf/fs-sink/write.c +++ b/plugins/ctf/fs-sink/write.c @@ -41,6 +41,23 @@ #include "writer.h" +static +void unref_stream_class(struct bt_ctf_stream_class *writer_stream_class) +{ + bt_put(writer_stream_class); +} + +static +void unref_stream(struct bt_ctf_stream_class *writer_stream) +{ + bt_put(writer_stream); +} + +gboolean empty_ht(gpointer key, gpointer value, gpointer user_data) +{ + return TRUE; +} + static void trace_is_static_listener(struct bt_ctf_trace *trace, void *data) { @@ -50,11 +67,12 @@ void trace_is_static_listener(struct bt_ctf_trace *trace, void *data) static struct bt_ctf_stream_class *insert_new_stream_class( struct writer_component *writer_component, - struct bt_ctf_writer *ctf_writer, + struct fs_writer *fs_writer, struct bt_ctf_stream_class *stream_class) { struct bt_ctf_stream_class *writer_stream_class = NULL; struct bt_ctf_trace *trace = NULL, *writer_trace = NULL; + struct bt_ctf_writer *ctf_writer = fs_writer->writer; enum bt_component_status ret; trace = bt_ctf_stream_class_get_trace(stream_class); @@ -91,7 +109,7 @@ struct bt_ctf_stream_class *insert_new_stream_class( goto error; } - g_hash_table_insert(writer_component->stream_class_map, + g_hash_table_insert(fs_writer->stream_class_map, (gpointer) stream_class, writer_stream_class); goto end; @@ -105,67 +123,6 @@ end: } static -struct bt_ctf_stream *insert_new_stream( - struct writer_component *writer_component, - struct bt_ctf_writer *ctf_writer, - struct bt_ctf_stream_class *stream_class, - struct bt_ctf_stream *stream) -{ - struct bt_ctf_stream *writer_stream = NULL; - struct bt_ctf_stream_class *writer_stream_class = NULL; - - writer_stream_class = g_hash_table_lookup( - writer_component->stream_class_map, - (gpointer) stream_class); - if (!writer_stream_class) { - writer_stream_class = insert_new_stream_class( - writer_component, ctf_writer, stream_class); - if (!writer_stream_class) { - fprintf(writer_component->err, "[error] %s in %s:%d\n", - __func__, __FILE__, __LINE__); - goto error; - } - } - bt_get(writer_stream_class); - - writer_stream = bt_ctf_writer_create_stream(ctf_writer, - writer_stream_class); - if (!writer_stream) { - fprintf(writer_component->err, "[error] %s in %s:%d\n", - __func__, __FILE__, __LINE__); - goto error; - } - - g_hash_table_insert(writer_component->stream_map, (gpointer) stream, - writer_stream); - - goto end; - -error: - BT_PUT(writer_stream); -end: - bt_put(writer_stream_class); - return writer_stream; -} - -static -struct bt_ctf_stream *lookup_stream(struct writer_component *writer_component, - struct bt_ctf_stream *stream) -{ - return (struct bt_ctf_stream *) g_hash_table_lookup( - writer_component->stream_map, - (gpointer) stream); -} - -static -struct bt_ctf_event_class *get_event_class(struct writer_component *writer_component, - struct bt_ctf_stream_class *writer_stream_class, - struct bt_ctf_event_class *event_class) -{ - return bt_ctf_stream_class_get_event_class_by_id(writer_stream_class, - bt_ctf_event_class_get_id(event_class)); -} - struct fs_writer *insert_new_writer( struct writer_component *writer_component, struct bt_ctf_trace *trace) @@ -215,6 +172,11 @@ struct fs_writer *insert_new_writer( goto error; } fs_writer->writer = ctf_writer; + fs_writer->stream_class_map = g_hash_table_new_full(g_direct_hash, + g_direct_equal, NULL, (GDestroyNotify) unref_stream_class); + fs_writer->stream_map = g_hash_table_new_full(g_direct_hash, + g_direct_equal, NULL, (GDestroyNotify) unref_stream); + fs_writer->trace = trace; fs_writer->writer_trace = writer_trace; BT_PUT(writer_trace); if (bt_ctf_trace_is_static(trace)) { @@ -274,6 +236,109 @@ end: return fs_writer; } +static +struct fs_writer *get_fs_writer_from_stream( + struct writer_component *writer_component, + struct bt_ctf_stream *stream) +{ + struct bt_ctf_stream_class *stream_class = NULL; + struct fs_writer *fs_writer; + + stream_class = bt_ctf_stream_get_class(stream); + if (!stream_class) { + fprintf(writer_component->err, "[error] %s in %s:%d\n", + __func__, __FILE__, __LINE__); + goto error; + } + + fs_writer = get_fs_writer(writer_component, stream_class); + goto end; + +error: + fs_writer = NULL; + +end: + bt_put(stream_class); + return fs_writer; +} + +static +struct bt_ctf_stream_class *lookup_stream_class( + struct writer_component *writer_component, + struct bt_ctf_stream_class *stream_class) +{ + struct fs_writer *fs_writer = get_fs_writer( + writer_component, stream_class); + assert(fs_writer); + return (struct bt_ctf_stream_class *) g_hash_table_lookup( + fs_writer->stream_class_map, (gpointer) stream_class); +} + +static +struct bt_ctf_stream *lookup_stream(struct writer_component *writer_component, + struct bt_ctf_stream *stream) +{ + struct fs_writer *fs_writer = get_fs_writer_from_stream( + writer_component, stream); + assert(fs_writer); + return (struct bt_ctf_stream *) g_hash_table_lookup( + fs_writer->stream_map, (gpointer) stream); +} + +static +struct bt_ctf_stream *insert_new_stream( + struct writer_component *writer_component, + struct fs_writer *fs_writer, + struct bt_ctf_stream_class *stream_class, + struct bt_ctf_stream *stream) +{ + struct bt_ctf_stream *writer_stream = NULL; + struct bt_ctf_stream_class *writer_stream_class = NULL; + struct bt_ctf_writer *ctf_writer = bt_get(fs_writer->writer); + + writer_stream_class = lookup_stream_class(writer_component, + stream_class); + if (!writer_stream_class) { + writer_stream_class = insert_new_stream_class( + writer_component, fs_writer, stream_class); + if (!writer_stream_class) { + fprintf(writer_component->err, "[error] %s in %s:%d\n", + __func__, __FILE__, __LINE__); + goto error; + } + } + bt_get(writer_stream_class); + + writer_stream = bt_ctf_writer_create_stream(ctf_writer, + writer_stream_class); + if (!writer_stream) { + fprintf(writer_component->err, "[error] %s in %s:%d\n", + __func__, __FILE__, __LINE__); + goto error; + } + + g_hash_table_insert(fs_writer->stream_map, (gpointer) stream, + writer_stream); + + goto end; + +error: + BT_PUT(writer_stream); +end: + bt_put(ctf_writer); + bt_put(writer_stream_class); + return writer_stream; +} + +static +struct bt_ctf_event_class *get_event_class(struct writer_component *writer_component, + struct bt_ctf_stream_class *writer_stream_class, + struct bt_ctf_event_class *event_class) +{ + return bt_ctf_stream_class_get_event_class_by_id(writer_stream_class, + bt_ctf_event_class_get_id(event_class)); +} + static struct bt_ctf_stream *get_writer_stream( struct writer_component *writer_component, @@ -298,19 +363,23 @@ end: } BT_HIDDEN -enum bt_component_status writer_close( - struct writer_component *writer_component, - struct fs_writer *fs_writer, - struct bt_ctf_trace *trace) +void writer_close(struct writer_component *writer_component, + struct fs_writer *fs_writer) { - enum bt_component_status ret = BT_COMPONENT_STATUS_OK; - if (fs_writer->static_listener_id > 0) { - bt_ctf_trace_remove_is_static_listener(trace, + bt_ctf_trace_remove_is_static_listener(fs_writer->trace, fs_writer->static_listener_id); } - g_hash_table_remove(writer_component->trace_map, trace); - return ret; + + /* Empty the stream class HT. */ + g_hash_table_foreach_remove(fs_writer->stream_class_map, + empty_ht, NULL); + g_hash_table_destroy(fs_writer->stream_class_map); + + /* Empty the stream HT. */ + g_hash_table_foreach_remove(fs_writer->stream_map, + empty_ht, NULL); + g_hash_table_destroy(fs_writer->stream_map); } BT_HIDDEN @@ -320,7 +389,6 @@ enum bt_component_status writer_stream_begin( { struct bt_ctf_stream_class *stream_class = NULL; struct fs_writer *fs_writer; - struct bt_ctf_writer *ctf_writer = NULL; struct bt_ctf_stream *writer_stream = NULL; enum bt_component_status ret = BT_COMPONENT_STATUS_OK; @@ -337,8 +405,7 @@ enum bt_component_status writer_stream_begin( __func__, __FILE__, __LINE__); goto error; } - ctf_writer = bt_get(fs_writer->writer); - writer_stream = insert_new_stream(writer_component, ctf_writer, + writer_stream = insert_new_stream(writer_component, fs_writer, stream_class, stream); if (!writer_stream) { fprintf(writer_component->err, "[error] %s in %s:%d\n", @@ -352,7 +419,6 @@ enum bt_component_status writer_stream_begin( error: ret = BT_COMPONENT_STATUS_ERROR; end: - bt_put(ctf_writer); bt_put(stream_class); return ret; } @@ -367,8 +433,6 @@ enum bt_component_status writer_stream_end( struct bt_ctf_trace *trace = NULL; enum bt_component_status ret = BT_COMPONENT_STATUS_OK; - g_hash_table_remove(writer_component->stream_map, stream); - stream_class = bt_ctf_stream_get_class(stream); if (!stream_class) { fprintf(writer_component->err, "[error] %s in %s:%d\n", @@ -382,17 +446,14 @@ enum bt_component_status writer_stream_end( __func__, __FILE__, __LINE__); goto error; } + g_hash_table_remove(fs_writer->stream_map, stream); assert(fs_writer->active_streams > 0); fs_writer->active_streams--; if (fs_writer->active_streams == 0 && fs_writer->trace_static) { - trace = bt_ctf_stream_class_get_trace(stream_class); - if (!trace) { - fprintf(writer_component->err, "[error] %s in %s:%d\n", - __func__, __FILE__, __LINE__); - goto error; - } - ret = writer_close(writer_component, fs_writer, trace); + writer_close(writer_component, fs_writer); + g_hash_table_remove(writer_component->trace_map, + fs_writer->trace); } goto end; @@ -551,9 +612,7 @@ enum bt_component_status writer_output_event( goto error; } - writer_stream_class = g_hash_table_lookup( - writer_component->stream_class_map, - (gpointer) stream_class); + writer_stream_class = lookup_stream_class(writer_component, stream_class); if (!writer_stream_class || !bt_get(writer_stream_class)) { fprintf(writer_component->err, "[error] %s in %s:%d\n", __func__, __FILE__, __LINE__); diff --git a/plugins/ctf/fs-sink/writer.c b/plugins/ctf/fs-sink/writer.c index e233a87d..fcc1eed9 100644 --- a/plugins/ctf/fs-sink/writer.c +++ b/plugins/ctf/fs-sink/writer.c @@ -46,8 +46,13 @@ #include "writer.h" #include -gboolean empty_ht(gpointer key, gpointer value, gpointer user_data) +gboolean empty_trace_map(gpointer key, gpointer value, gpointer user_data) { + struct fs_writer *fs_writer = value; + struct writer_component *writer_component = user_data; + + writer_close(writer_component, fs_writer); + return TRUE; } @@ -56,16 +61,8 @@ void destroy_writer_component_data(struct writer_component *writer_component) { bt_put(writer_component->input_iterator); - g_hash_table_foreach_remove(writer_component->stream_class_map, - empty_ht, NULL); - g_hash_table_destroy(writer_component->stream_class_map); - - g_hash_table_foreach_remove(writer_component->stream_map, - empty_ht, NULL); - g_hash_table_destroy(writer_component->stream_map); - g_hash_table_foreach_remove(writer_component->trace_map, - empty_ht, NULL); + empty_trace_map, writer_component); g_hash_table_destroy(writer_component->trace_map); g_string_free(writer_component->base_path, true); @@ -82,18 +79,6 @@ void writer_component_finalize(struct bt_private_component *component) g_free(writer_component); } -static -void unref_stream_class(struct bt_ctf_stream_class *writer_stream_class) -{ - bt_put(writer_stream_class); -} - -static -void unref_stream(struct bt_ctf_stream_class *writer_stream) -{ - bt_put(writer_stream); -} - static void free_fs_writer(struct fs_writer *fs_writer) { @@ -114,7 +99,6 @@ struct writer_component *create_writer_component(void) writer_component->err = stderr; writer_component->trace_id = 0; writer_component->trace_name_base = g_string_new("trace"); - writer_component->processed_first_event = false; if (!writer_component->trace_name_base) { g_free(writer_component); writer_component = NULL; @@ -126,10 +110,6 @@ struct writer_component *create_writer_component(void) */ writer_component->trace_map = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, (GDestroyNotify) free_fs_writer); - writer_component->stream_class_map = g_hash_table_new_full(g_direct_hash, - g_direct_equal, NULL, (GDestroyNotify) unref_stream_class); - writer_component->stream_map = g_hash_table_new_full(g_direct_hash, - g_direct_equal, NULL, (GDestroyNotify) unref_stream); end: return writer_component; diff --git a/plugins/ctf/fs-sink/writer.h b/plugins/ctf/fs-sink/writer.h index da2eb1e8..8025d22f 100644 --- a/plugins/ctf/fs-sink/writer.h +++ b/plugins/ctf/fs-sink/writer.h @@ -39,24 +39,27 @@ struct writer_component { int trace_id; /* Map between struct bt_ctf_trace and struct bt_ctf_writer. */ GHashTable *trace_map; - /* Map between reader and writer stream. */ - GHashTable *stream_map; - /* Map between reader and writer stream class. */ - GHashTable *stream_class_map; FILE *err; struct bt_notification_iterator *input_iterator; - bool processed_first_event; bool error; }; struct fs_writer { struct bt_ctf_writer *writer; + struct bt_ctf_trace *trace; struct bt_ctf_trace *writer_trace; int static_listener_id; unsigned int active_streams; int trace_static; + /* Map between reader and writer stream. */ + GHashTable *stream_map; + /* Map between reader and writer stream class. */ + GHashTable *stream_class_map; }; +BT_HIDDEN +void writer_close(struct writer_component *writer_component, + struct fs_writer *fs_writer); BT_HIDDEN enum bt_component_status writer_output_event(struct writer_component *writer, struct bt_ctf_event *event);