*/
#include <babeltrace/graph/connection.h>
+#include <babeltrace/graph/notification-iterator.h>
#include <babeltrace/graph/private-connection.h>
#include <babeltrace/object-internal.h>
void bt_connection_remove_iterator(struct bt_connection *conn,
struct bt_notification_iterator *iterator);
+static inline
+enum bt_connection_status
+bt_connection_status_from_notification_iterator_status(
+ enum bt_notification_iterator_status iter_status)
+{
+ switch (iter_status) {
+ case BT_NOTIFICATION_ITERATOR_STATUS_CANCELED:
+ return BT_CONNECTION_STATUS_ERROR;
+ case BT_NOTIFICATION_ITERATOR_STATUS_AGAIN:
+ return BT_CONNECTION_STATUS_ERROR;
+ case BT_NOTIFICATION_ITERATOR_STATUS_END:
+ return BT_CONNECTION_STATUS_ERROR;
+ case BT_NOTIFICATION_ITERATOR_STATUS_OK:
+ return BT_CONNECTION_STATUS_OK;
+ case BT_NOTIFICATION_ITERATOR_STATUS_INVALID:
+ return BT_CONNECTION_STATUS_INVALID;
+ case BT_NOTIFICATION_ITERATOR_STATUS_ERROR:
+ return BT_CONNECTION_STATUS_ERROR;
+ case BT_NOTIFICATION_ITERATOR_STATUS_NOMEM:
+ return BT_CONNECTION_STATUS_NOMEM;
+ case BT_NOTIFICATION_ITERATOR_STATUS_UNSUPPORTED:
+ return BT_CONNECTION_STATUS_ERROR;
+ default:
+#ifdef BT_LOGF
+ BT_LOGF("Unknown notification iterator status: status=%d",
+ iter_status);
+#endif
+ abort();
+ }
+}
+
#endif /* BABELTRACE_COMPONENT_CONNECTION_INTERNAL_H */
* SOFTWARE.
*/
+#include <babeltrace/types.h>
+
#ifdef __cplusplus
extern "C" {
#endif
struct bt_component;
struct bt_connection;
+enum bt_connection_status {
+ BT_CONNECTION_STATUS_GRAPH_IS_CANCELED = 125,
+ BT_CONNECTION_STATUS_OK = 0,
+ BT_CONNECTION_STATUS_INVALID = -22,
+ BT_CONNECTION_STATUS_ERROR = -1,
+ BT_CONNECTION_STATUS_NOMEM = -12,
+ BT_CONNECTION_STATUS_IS_ENDED = 104,
+};
+
/* Returns the "downstream" input port. */
extern struct bt_port *bt_connection_get_downstream_port(
struct bt_connection *connection);
return (void *) notification_iterator;
}
-/**
- * Allocate a notification iterator.
- *
- * @param component Component instance
- * @returns A notification iterator instance
- */
BT_HIDDEN
-struct bt_notification_iterator *bt_notification_iterator_create(
- struct bt_component *upstream_component,
+enum bt_connection_status bt_notification_iterator_create(
+ struct bt_component *upstream_comp,
struct bt_port *upstream_port,
const enum bt_notification_type *notification_types,
- struct bt_connection *connection);
+ struct bt_connection *connection,
+ struct bt_notification_iterator **iterator);
BT_HIDDEN
void bt_notification_iterator_finalize(
* SOFTWARE.
*/
+#include <babeltrace/graph/connection.h>
#include <babeltrace/graph/notification.h>
#ifdef __cplusplus
struct bt_connection *bt_connection_from_private_connection(
struct bt_private_connection *private_connection);
-extern struct bt_notification_iterator *
+extern enum bt_connection_status
bt_private_connection_create_notification_iterator(
struct bt_private_connection *private_connection,
- const enum bt_notification_type *notification_types);
+ const enum bt_notification_type *notification_types,
+ struct bt_notification_iterator **iterator);
#ifdef __cplusplus
}
return connection ? bt_get(connection->downstream_port) : NULL;
}
-struct bt_notification_iterator *
+enum bt_connection_status
bt_private_connection_create_notification_iterator(
struct bt_private_connection *private_connection,
- const enum bt_notification_type *notification_types)
+ const enum bt_notification_type *notification_types,
+ struct bt_notification_iterator **user_iterator)
{
enum bt_component_class_type upstream_comp_class_type;
struct bt_notification_iterator *iterator = NULL;
struct bt_component_class *upstream_comp_class = NULL;
struct bt_connection *connection = NULL;
bt_component_class_notification_iterator_init_method init_method = NULL;
+ enum bt_connection_status status;
static const enum bt_notification_type all_notif_types[] = {
BT_NOTIFICATION_TYPE_ALL,
BT_NOTIFICATION_TYPE_SENTINEL,
if (!private_connection) {
BT_LOGW_STR("Invalid parameter: private connection is NULL.");
- goto error;
+ status = BT_CONNECTION_STATUS_INVALID;
+ goto end;
+ }
+
+ if (!user_iterator) {
+ BT_LOGW_STR("Invalid parameter: notification iterator pointer is NULL.");
+ status = BT_CONNECTION_STATUS_INVALID;
+ goto end;
}
if (!notification_types) {
}
connection = bt_connection_from_private(private_connection);
- if (!connection->upstream_port || !connection->downstream_port) {
+ if (bt_connection_is_ended(connection)) {
BT_LOGW("Invalid parameter: connection is ended: "
"conn-addr=%p", connection);
- goto error;
+ status = BT_CONNECTION_STATUS_IS_ENDED;
+ goto end;
}
upstream_port = connection->upstream_port;
upstream_component, bt_component_get_name(upstream_component));
upstream_comp_class_type =
bt_component_get_class_type(upstream_component);
- if (upstream_comp_class_type != BT_COMPONENT_CLASS_TYPE_SOURCE &&
- upstream_comp_class_type != BT_COMPONENT_CLASS_TYPE_FILTER) {
- /* Unsupported operation. */
- BT_LOGW("Upstream component's class is not a source or filter component class: "
- "comp-class-type=%s",
- bt_component_class_type_string(upstream_comp_class_type));
- goto error;
- }
-
- iterator = bt_notification_iterator_create(upstream_component,
- upstream_port, notification_types, connection);
- if (!iterator) {
+ assert(upstream_comp_class_type == BT_COMPONENT_CLASS_TYPE_SOURCE ||
+ upstream_comp_class_type == BT_COMPONENT_CLASS_TYPE_FILTER);
+ status = bt_notification_iterator_create(upstream_component,
+ upstream_port, notification_types, connection, &iterator);
+ if (status != BT_CONNECTION_STATUS_OK) {
BT_LOGW("Cannot create notification iterator from connection.");
- goto error;
+ goto end;
}
switch (upstream_comp_class_type) {
}
default:
/* Unreachable. */
+ BT_LOGF("Unknown component class type: type=%d",
+ upstream_comp_class_type);
abort();
}
if (init_method) {
- enum bt_notification_iterator_status status;
+ enum bt_notification_iterator_status iter_status;
BT_LOGD("Calling user's initialization method: iter-addr=%p",
iterator);
- status = init_method(
+ iter_status = init_method(
bt_private_notification_iterator_from_notification_iterator(iterator),
bt_private_port_from_port(upstream_port));
BT_LOGD("User method returned: status=%s",
- bt_notification_iterator_status_string(status));
- if (status < 0) {
+ bt_notification_iterator_status_string(iter_status));
+ if (iter_status != BT_NOTIFICATION_ITERATOR_STATUS_OK) {
BT_LOGW_STR("Initialization method failed.");
- goto error;
+ status = bt_connection_status_from_notification_iterator_status(
+ iter_status);
+ goto end;
}
}
bt_port_get_name(connection->upstream_port),
upstream_component, bt_component_get_name(upstream_component),
iterator);
- goto end;
-
-error:
- BT_PUT(iterator);
+ BT_MOVE(*user_iterator, iterator);
end:
bt_put(upstream_component);
- return iterator;
+ bt_put(iterator);
+ return status;
}
BT_HIDDEN
#include <babeltrace/ctf-ir/event-internal.h>
#include <babeltrace/ctf-ir/packet-internal.h>
#include <babeltrace/ctf-ir/stream-internal.h>
+#include <babeltrace/graph/connection.h>
#include <babeltrace/graph/connection-internal.h>
#include <babeltrace/graph/component.h>
#include <babeltrace/graph/component-source-internal.h>
}
BT_HIDDEN
-struct bt_notification_iterator *bt_notification_iterator_create(
+enum bt_connection_status bt_notification_iterator_create(
struct bt_component *upstream_comp,
struct bt_port *upstream_port,
const enum bt_notification_type *notification_types,
- struct bt_connection *connection)
+ struct bt_connection *connection,
+ struct bt_notification_iterator **user_iterator)
{
+ enum bt_connection_status status = BT_CONNECTION_STATUS_OK;
enum bt_component_class_type type;
struct bt_notification_iterator *iterator = NULL;
assert(upstream_port);
assert(notification_types);
assert(bt_port_is_connected(upstream_port));
+ assert(user_iterator);
BT_LOGD("Creating notification iterator: "
"upstream-comp-addr=%p, upstream-comp-name=\"%s\", "
"upstream-port-addr=%p, upstream-port-name=\"%s\", "
iterator = g_new0(struct bt_notification_iterator, 1);
if (!iterator) {
BT_LOGE_STR("Failed to allocate one notification iterator.");
- goto error;
+ status = BT_CONNECTION_STATUS_NOMEM;
+ goto end;
}
bt_object_init(iterator, bt_notification_iterator_destroy);
if (create_subscription_mask_from_notification_types(iterator,
notification_types)) {
BT_LOGW_STR("Cannot create subscription mask from notification types.");
- goto error;
+ status = BT_CONNECTION_STATUS_INVALID;
+ goto end;
}
iterator->stream_states = g_hash_table_new_full(g_direct_hash,
g_direct_equal, NULL, (GDestroyNotify) destroy_stream_state);
if (!iterator->stream_states) {
BT_LOGE_STR("Failed to allocate a GHashTable.");
- goto error;
+ status = BT_CONNECTION_STATUS_NOMEM;
+ goto end;
}
iterator->queue = g_queue_new();
if (!iterator->queue) {
BT_LOGE_STR("Failed to allocate a GQueue.");
- goto error;
+ status = BT_CONNECTION_STATUS_NOMEM;
+ goto end;
}
iterator->actions = g_array_new(FALSE, FALSE, sizeof(struct action));
if (!iterator->actions) {
BT_LOGE_STR("Failed to allocate a GArray.");
- goto error;
+ status = BT_CONNECTION_STATUS_NOMEM;
+ goto end;
}
iterator->upstream_component = upstream_comp;
upstream_comp, bt_component_get_name(upstream_comp),
upstream_port, bt_port_get_name(upstream_port),
connection, iterator);
- goto end;
-
-error:
- BT_PUT(iterator);
+ BT_MOVE(*user_iterator, iterator);
end:
- return iterator;
+ bt_put(iterator);
+ return status;
}
void *bt_private_notification_iterator_get_user_data(
#include <babeltrace/ctf-ir/packet.h>
#include <babeltrace/plugin/plugin-dev.h>
+#include <babeltrace/graph/connection.h>
#include <babeltrace/graph/component.h>
#include <babeltrace/graph/private-component.h>
#include <babeltrace/graph/component-sink.h>
{
struct bt_private_connection *connection;
struct writer_component *writer;
+ enum bt_connection_status conn_status;
static const enum bt_notification_type notif_types[] = {
BT_NOTIFICATION_TYPE_EVENT,
BT_NOTIFICATION_TYPE_PACKET_BEGIN,
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) {
+ conn_status = bt_private_connection_create_notification_iterator(
+ connection, notif_types, &writer->input_iterator);
+ if (conn_status != BT_CONNECTION_STATUS_OK) {
writer->error = true;
}
#include <babeltrace/graph/notification-iterator.h>
#include <babeltrace/graph/private-notification-iterator.h>
+#include <babeltrace/graph/connection.h>
#include <babeltrace/graph/notification.h>
#include <babeltrace/graph/notification-event.h>
#include <babeltrace/graph/notification-stream.h>
enum bt_notification_iterator_status ret =
BT_NOTIFICATION_ITERATOR_STATUS_OK;
enum bt_notification_iterator_status it_ret;
+ enum bt_connection_status conn_status;
struct bt_private_connection *connection = NULL;
struct bt_private_component *component =
bt_private_notification_iterator_get_private_component(iterator);
goto end;
}
- it_data->input_iterator = bt_private_connection_create_notification_iterator(
- connection, notif_types);
- if (!it_data->input_iterator) {
- ret = BT_NOTIFICATION_ITERATOR_STATUS_NOMEM;
+ conn_status = bt_private_connection_create_notification_iterator(
+ connection, notif_types, &it_data->input_iterator);
+ if (conn_status != BT_CONNECTION_STATUS_OK) {
+ ret = BT_NOTIFICATION_ITERATOR_STATUS_ERROR;
goto end;
}
struct bt_private_port *self_port,
struct bt_port *other_port)
{
+ enum bt_connection_status conn_status;
struct bt_private_connection *connection;
struct pretty_component *pretty;
static const enum bt_notification_type notif_types[] = {
assert(!pretty->input_iterator);
connection = bt_private_port_get_private_connection(self_port);
assert(connection);
- pretty->input_iterator =
- bt_private_connection_create_notification_iterator(connection,
- notif_types);
-
- if (!pretty->input_iterator) {
+ conn_status = bt_private_connection_create_notification_iterator(
+ connection, notif_types, &pretty->input_iterator);
+ if (conn_status != BT_CONNECTION_STATUS_OK) {
pretty->error = true;
}
*/
#include <babeltrace/plugin/plugin-dev.h>
+#include <babeltrace/graph/connection.h>
#include <babeltrace/graph/component.h>
#include <babeltrace/graph/private-component.h>
#include <babeltrace/graph/private-component-sink.h>
struct dummy *dummy;
struct bt_notification_iterator *iterator;
struct bt_private_connection *connection;
+ enum bt_connection_status conn_status;
dummy = bt_private_component_get_user_data(component);
assert(dummy);
connection = bt_private_port_get_private_connection(self_port);
assert(connection);
- iterator = bt_private_connection_create_notification_iterator(
- connection, NULL);
- if (!iterator) {
+ conn_status = bt_private_connection_create_notification_iterator(
+ connection, NULL, &iterator);
+ if (conn_status != BT_CONNECTION_STATUS_OK) {
dummy->error = true;
goto end;
}
#include <babeltrace/graph/private-connection.h>
#include <babeltrace/graph/private-notification-iterator.h>
#include <babeltrace/graph/private-port.h>
+#include <babeltrace/graph/connection.h>
#include <plugins-common.h>
#include <glib.h>
#include <stdbool.h>
struct bt_port *port = bt_port_from_private_port(priv_port);
struct bt_notification_iterator *notif_iter = NULL;
struct bt_private_connection *priv_conn = NULL;
+ enum bt_connection_status conn_status;
assert(ret);
*ret = 0;
// TODO: Advance the iterator to >= the time of the latest
// returned notification by the muxer notification
// iterator which creates it.
- notif_iter = bt_private_connection_create_notification_iterator(
- priv_conn, NULL);
- if (!notif_iter) {
+ conn_status = bt_private_connection_create_notification_iterator(
+ priv_conn, NULL, ¬if_iter);
+ if (conn_status != BT_CONNECTION_STATUS_OK) {
*ret = -1;
goto end;
}
#include <babeltrace/graph/private-port.h>
#include <babeltrace/graph/private-connection.h>
#include <babeltrace/graph/private-component.h>
+#include <babeltrace/graph/connection.h>
#include <babeltrace/ctf-ir/event.h>
#include <babeltrace/ctf-ir/stream.h>
#include <babeltrace/ctf-ir/stream-class.h>
enum bt_notification_iterator_status ret =
BT_NOTIFICATION_ITERATOR_STATUS_OK;
enum bt_notification_iterator_status it_ret;
+ enum bt_connection_status conn_status;
struct bt_private_port *input_port = NULL;
struct bt_private_connection *connection = NULL;
struct bt_private_component *component =
connection = bt_private_port_get_private_connection(input_port);
assert(connection);
- it_data->input_iterator =
- bt_private_connection_create_notification_iterator(connection,
- notif_types);
- if (!it_data->input_iterator) {
- ret = BT_NOTIFICATION_ITERATOR_STATUS_NOMEM;
+ conn_status = bt_private_connection_create_notification_iterator(connection,
+ notif_types, &it_data->input_iterator);
+ if (conn_status != BT_CONNECTION_STATUS_OK) {
+ ret = BT_NOTIFICATION_ITERATOR_STATUS_ERROR;
goto end;
}
#include <babeltrace/graph/component-sink.h>
#include <babeltrace/graph/component-source.h>
#include <babeltrace/graph/component.h>
+#include <babeltrace/graph/connection.h>
#include <babeltrace/graph/graph.h>
#include <babeltrace/graph/notification-event.h>
#include <babeltrace/graph/notification-inactivity.h>
bt_private_port_get_private_connection(self_private_port);
struct sink_user_data *user_data = bt_private_component_get_user_data(
private_component);
+ enum bt_connection_status conn_status;
assert(user_data);
assert(priv_conn);
- user_data->notif_iter =
- bt_private_connection_create_notification_iterator(priv_conn,
- NULL);
- assert(user_data->notif_iter);
+ conn_status = bt_private_connection_create_notification_iterator(
+ priv_conn, NULL, &user_data->notif_iter);
+ assert(conn_status == 0);
bt_put(priv_conn);
}
bt_private_port_get_private_connection(self_private_port);
struct sink_user_data *user_data = bt_private_component_get_user_data(
private_component);
+ enum bt_connection_status conn_status;
assert(user_data);
assert(priv_conn);
- user_data->notif_iter =
- bt_private_connection_create_notification_iterator(priv_conn,
- NULL);
- assert(user_data->notif_iter);
+ conn_status = bt_private_connection_create_notification_iterator(
+ priv_conn, NULL, &user_data->notif_iter);
+ assert(conn_status == 0);
bt_put(priv_conn);
}