X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=plugins%2Fctf%2Ffs-sink%2Fwriter.c;h=d9166834e02580495e62fc353f2e1a5d37294c92;hb=601b0d3c9a6bf91274d0f01ccdec7fecfe3ed310;hp=fcc1eed9d3fce7f22edc8fcf7e1389b9a7cd2742;hpb=a619fcb71906fd9dd9ed75c3c8d9f14ab8204637;p=babeltrace.git diff --git a/plugins/ctf/fs-sink/writer.c b/plugins/ctf/fs-sink/writer.c index fcc1eed9..d9166834 100644 --- a/plugins/ctf/fs-sink/writer.c +++ b/plugins/ctf/fs-sink/writer.c @@ -26,31 +26,24 @@ * SOFTWARE. */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#define BT_LOG_TAG "PLUGIN-CTF-FS-SINK-WRITER" +#include "logging.h" + +#include #include #include #include #include #include "writer.h" -#include +#include +static gboolean empty_trace_map(gpointer key, gpointer value, gpointer user_data) { struct fs_writer *fs_writer = value; struct writer_component *writer_component = user_data; + fs_writer->trace_static = 1; writer_close(writer_component, fs_writer); return TRUE; @@ -59,7 +52,7 @@ gboolean empty_trace_map(gpointer key, gpointer value, gpointer user_data) static void destroy_writer_component_data(struct writer_component *writer_component) { - bt_put(writer_component->input_iterator); + bt_object_put_ref(writer_component->input_iterator); g_hash_table_foreach_remove(writer_component->trace_map, empty_trace_map, writer_component); @@ -82,7 +75,7 @@ void writer_component_finalize(struct bt_private_component *component) static void free_fs_writer(struct fs_writer *fs_writer) { - bt_put(fs_writer->writer); + bt_object_put_ref(fs_writer->writer); g_free(fs_writer); } @@ -130,7 +123,7 @@ enum bt_component_status handle_notification( switch (bt_notification_get_type(notification)) { case BT_NOTIFICATION_TYPE_PACKET_BEGIN: { - struct bt_ctf_packet *packet = + struct bt_packet *packet = bt_notification_packet_begin_get_packet(notification); if (!packet) { @@ -139,12 +132,12 @@ enum bt_component_status handle_notification( } ret = writer_new_packet(writer_component, packet); - bt_put(packet); + bt_object_put_ref(packet); break; } case BT_NOTIFICATION_TYPE_PACKET_END: { - struct bt_ctf_packet *packet = + struct bt_packet *packet = bt_notification_packet_end_get_packet(notification); if (!packet) { @@ -152,12 +145,12 @@ enum bt_component_status handle_notification( goto end; } ret = writer_close_packet(writer_component, packet); - bt_put(packet); + bt_object_put_ref(packet); break; } case BT_NOTIFICATION_TYPE_EVENT: { - struct bt_ctf_event *event = bt_notification_event_get_event( + struct bt_event *event = bt_notification_event_get_event( notification); if (!event) { @@ -165,7 +158,7 @@ enum bt_component_status handle_notification( goto end; } ret = writer_output_event(writer_component, event); - bt_put(event); + bt_object_put_ref(event); if (ret != BT_COMPONENT_STATUS_OK) { goto end; } @@ -173,7 +166,7 @@ enum bt_component_status handle_notification( } case BT_NOTIFICATION_TYPE_STREAM_BEGIN: { - struct bt_ctf_stream *stream = + struct bt_stream *stream = bt_notification_stream_begin_get_stream(notification); if (!stream) { @@ -181,12 +174,12 @@ enum bt_component_status handle_notification( goto end; } ret = writer_stream_begin(writer_component, stream); - bt_put(stream); + bt_object_put_ref(stream); break; } case BT_NOTIFICATION_TYPE_STREAM_END: { - struct bt_ctf_stream *stream = + struct bt_stream *stream = bt_notification_stream_end_get_stream(notification); if (!stream) { @@ -194,11 +187,11 @@ enum bt_component_status handle_notification( goto end; } ret = writer_stream_end(writer_component, stream); - bt_put(stream); + bt_object_put_ref(stream); break; } default: - puts("Unhandled notification type"); + break; } end: return ret; @@ -212,29 +205,20 @@ void writer_component_port_connected( { struct bt_private_connection *connection; struct writer_component *writer; - static const enum bt_notification_type notif_types[] = { - BT_NOTIFICATION_TYPE_EVENT, - BT_NOTIFICATION_TYPE_PACKET_BEGIN, - BT_NOTIFICATION_TYPE_PACKET_END, - BT_NOTIFICATION_TYPE_STREAM_BEGIN, - BT_NOTIFICATION_TYPE_STREAM_END, - BT_NOTIFICATION_TYPE_SENTINEL, - }; + enum bt_connection_status conn_status; writer = bt_private_component_get_user_data(component); - assert(writer); - assert(!writer->input_iterator); + BT_ASSERT(writer); + BT_ASSERT(!writer->input_iterator); connection = bt_private_port_get_private_connection(self_port); - assert(connection); - writer->input_iterator = - bt_private_connection_create_notification_iterator(connection, - notif_types); - - if (!writer->input_iterator) { + BT_ASSERT(connection); + conn_status = bt_private_connection_create_notification_iterator( + connection, &writer->input_iterator); + if (conn_status != BT_CONNECTION_STATUS_OK) { writer->error = true; } - bt_put(connection); + bt_object_put_ref(connection); } BT_HIDDEN @@ -253,13 +237,13 @@ enum bt_component_status writer_run(struct bt_private_component *component) } it = writer_component->input_iterator; - assert(it); + BT_ASSERT(it); it_ret = bt_notification_iterator_next(it); switch (it_ret) { case BT_NOTIFICATION_ITERATOR_STATUS_END: ret = BT_COMPONENT_STATUS_END; - BT_PUT(writer_component->input_iterator); + BT_OBJECT_PUT_REF_AND_RESET(writer_component->input_iterator); goto end; case BT_NOTIFICATION_ITERATOR_STATUS_AGAIN: ret = BT_COMPONENT_STATUS_AGAIN; @@ -272,10 +256,36 @@ enum bt_component_status writer_run(struct bt_private_component *component) } notification = bt_notification_iterator_get_notification(it); - assert(notification); + BT_ASSERT(notification); ret = handle_notification(writer_component, notification); end: - bt_put(notification); + bt_object_put_ref(notification); + return ret; +} + +static +enum bt_component_status apply_one_bool(const char *key, + struct bt_value *params, + bool *option, + bool *found) +{ + enum bt_component_status ret = BT_COMPONENT_STATUS_OK; + struct bt_value *value = NULL; + enum bt_value_status status; + bt_bool bool_val; + + value = bt_value_map_get(params, key); + if (!value) { + goto end; + } + bool_val = bt_value_bool_get(value); + + *option = (bool) bool_val; + if (found) { + *found = true; + } +end: + bt_object_put_ref(value); return ret; } @@ -289,26 +299,21 @@ enum bt_component_status writer_component_init( struct writer_component *writer_component = create_writer_component(); struct bt_value *value = NULL; const char *path; - void *priv_port; if (!writer_component) { ret = BT_COMPONENT_STATUS_NOMEM; goto end; } - priv_port = bt_private_component_sink_add_input_private_port(component, - "in", NULL); - if (!priv_port) { - ret = BT_COMPONENT_STATUS_NOMEM; + ret = bt_private_component_sink_add_input_private_port(component, + "in", NULL, NULL); + if (ret != BT_COMPONENT_STATUS_OK) { goto end; } - bt_put(priv_port); - value = bt_value_map_get(params, "path"); if (!value || bt_value_is_null(value) || !bt_value_is_string(value)) { - fprintf(writer_component->err, - "[error] output path parameter required\n"); + BT_LOGE_STR("Missing mandatory \"path\" parameter."); ret = BT_COMPONENT_STATUS_INVALID; goto error; } @@ -318,14 +323,21 @@ enum bt_component_status writer_component_init( ret = BT_COMPONENT_STATUS_INVALID; goto error; } - bt_put(value); + bt_object_put_ref(value); writer_component->base_path = g_string_new(path); - if (!writer_component) { + if (!writer_component->base_path) { ret = BT_COMPONENT_STATUS_ERROR; goto error; } + writer_component->single_trace = false; + ret = apply_one_bool("single-trace", params, + &writer_component->single_trace, NULL); + if (ret != BT_COMPONENT_STATUS_OK) { + goto end; + } + ret = bt_private_component_set_user_data(component, writer_component); if (ret != BT_COMPONENT_STATUS_OK) { goto error;