From: Mathieu Desnoyers Date: Mon, 15 May 2017 21:33:38 +0000 (-0400) Subject: lttng-live: ensure that port connections go to the same component X-Git-Tag: v2.0.0-pre1~242 X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=commitdiff_plain;h=d85ef162f9130fe7c11564f685d1542bc4782036 lttng-live: ensure that port connections go to the same component Also has tiny cleanups. Signed-off-by: Mathieu Desnoyers Signed-off-by: Jérémie Galarneau --- diff --git a/plugins/ctf/lttng-live/lttng-live-internal.h b/plugins/ctf/lttng-live/lttng-live-internal.h index 3d8b5fa7..6b2d71fb 100644 --- a/plugins/ctf/lttng-live/lttng-live-internal.h +++ b/plugins/ctf/lttng-live/lttng-live-internal.h @@ -191,6 +191,8 @@ struct lttng_live_component { struct bt_private_port *no_stream_port; struct lttng_live_no_stream_iterator *no_stream_iter; + + struct bt_component *downstream_component; }; enum bt_ctf_lttng_live_iterator_status { @@ -212,7 +214,6 @@ enum bt_ctf_lttng_live_iterator_status { BT_CTF_LTTNG_LIVE_ITERATOR_STATUS_UNSUPPORTED = -4, }; -BT_HIDDEN enum bt_component_status lttng_live_component_init(struct bt_private_component *source, struct bt_value *params, void *init_method_data); @@ -221,10 +222,13 @@ struct bt_value *lttng_live_query(struct bt_component_class *comp_class, void lttng_live_component_finalize(struct bt_private_component *component); -BT_HIDDEN struct bt_notification_iterator_next_return lttng_live_iterator_next( struct bt_private_notification_iterator *iterator); +enum bt_component_status lttng_live_accept_port_connection( + struct bt_private_component *private_component, + struct bt_private_port *self_private_port, + struct bt_port *other_port); enum bt_notification_iterator_status lttng_live_iterator_init( struct bt_private_notification_iterator *it, diff --git a/plugins/ctf/lttng-live/lttng-live.c b/plugins/ctf/lttng-live/lttng-live.c index 7c1d22a4..813674fa 100644 --- a/plugins/ctf/lttng-live/lttng-live.c +++ b/plugins/ctf/lttng-live/lttng-live.c @@ -1063,6 +1063,43 @@ error: return ret; } +BT_HIDDEN +enum bt_component_status lttng_live_accept_port_connection( + struct bt_private_component *private_component, + struct bt_private_port *self_private_port, + struct bt_port *other_port) +{ + struct lttng_live_component *lttng_live = + bt_private_component_get_user_data(private_component); + struct bt_component *other_component; + enum bt_component_status status = BT_COMPONENT_STATUS_OK; + struct bt_port *self_port = bt_port_from_private_port(self_private_port); + + other_component = bt_port_get_component(other_port); + bt_put(other_component); /* weak */ + + if (!lttng_live->downstream_component) { + lttng_live->downstream_component = other_component; + goto end; + } + + /* + * Compare prior component to ensure we are connected to the + * same downstream component as prior ports. + */ + if (lttng_live->downstream_component != other_component) { + BT_LOGW("Cannot connect ctf.lttng-live component port \"%s\" to component \"%s\": already connected to component \"%s\".", + bt_port_get_name(self_port), + bt_component_get_name(other_component), + bt_component_get_name(lttng_live->downstream_component)); + status = BT_COMPONENT_STATUS_REFUSE_PORT_CONNECTION; + goto end; + } +end: + bt_put(self_port); + return status; +} + static void __attribute__((constructor)) bt_lttng_live_logging_ctor(void) { @@ -1085,6 +1122,10 @@ void __attribute__((constructor)) bt_lttng_live_logging_ctor(void) log_level = BT_LOGGING_LEVEL_ERROR; } else if (strcmp(log_level_env, "FATAL") == 0) { log_level = BT_LOGGING_LEVEL_FATAL; + } else { + bt_lttng_live_log_level = BT_LOGGING_LEVEL_FATAL; + BT_LOGF("Incorrect log level specified in BABELTRACE_PLUGIN_LTTNG_LIVE_LOG_LEVEL"); + abort(); } bt_lttng_live_log_level = log_level; diff --git a/plugins/ctf/plugin.c b/plugins/ctf/plugin.c index 63f7f8b3..789f3c7e 100644 --- a/plugins/ctf/plugin.c +++ b/plugins/ctf/plugin.c @@ -68,6 +68,8 @@ BT_PLUGIN_SOURCE_COMPONENT_CLASS_QUERY_METHOD_WITH_ID(auto, lttng_live, lttng_live_query); BT_PLUGIN_SOURCE_COMPONENT_CLASS_FINALIZE_METHOD_WITH_ID(auto, lttng_live, lttng_live_component_finalize); +BT_PLUGIN_SOURCE_COMPONENT_CLASS_ACCEPT_PORT_CONNECTION_METHOD_WITH_ID(auto, + lttng_live, lttng_live_accept_port_connection); BT_PLUGIN_SOURCE_COMPONENT_CLASS_NOTIFICATION_ITERATOR_INIT_METHOD_WITH_ID( auto, lttng_live, lttng_live_iterator_init); BT_PLUGIN_SOURCE_COMPONENT_CLASS_NOTIFICATION_ITERATOR_FINALIZE_METHOD_WITH_ID(