lib: add bt_{graph,query_executor}_add_interrupter()
[babeltrace.git] / src / lib / graph / component.c
index 6018a2782b891136ca68f695dd13d686ab29779e..11144fb42c400eb531b8fa8340f43ef3d0a1eaec 100644 (file)
  * SOFTWARE.
  */
 
-#define BT_LOG_TAG "COMP"
-#include "lib/lib-logging.h"
+#define BT_LOG_TAG "LIB/COMPONENT"
+#include "lib/logging.h"
 
+#include "common/common.h"
 #include "common/assert.h"
 #include "lib/assert-pre.h"
+#include "lib/assert-post.h"
 #include <babeltrace2/graph/self-component.h>
 #include <babeltrace2/graph/component-const.h>
 #include <babeltrace2/graph/component-source-const.h>
 #include <babeltrace2/graph/component-filter-const.h>
 #include <babeltrace2/graph/component-sink-const.h>
+#include <babeltrace2/graph/graph-const.h>
 #include "common/macros.h"
 #include "compat/compiler.h"
 #include <babeltrace2/types.h>
@@ -48,6 +51,7 @@
 #include "graph.h"
 #include "message/iterator.h"
 #include "port.h"
+#include "lib/func-status.h"
 
 static
 struct bt_component * (* const component_create_funcs[])(
@@ -186,27 +190,24 @@ void destroy_component(struct bt_object *obj)
 enum bt_component_class_type bt_component_get_class_type(
                const struct bt_component *component)
 {
-       BT_ASSERT_PRE_NON_NULL(component, "Component");
+       BT_ASSERT_PRE_DEV_NON_NULL(component, "Component");
        return component->class->type;
 }
 
 static
-enum bt_self_component_status add_port(
+enum bt_self_component_add_port_status add_port(
                struct bt_component *component, GPtrArray *ports,
                enum bt_port_type port_type, const char *name, void *user_data,
                struct bt_port **port)
 {
        struct bt_port *new_port = NULL;
        struct bt_graph *graph = NULL;
-       enum bt_self_component_status status;
+       enum bt_self_component_add_port_status status;
 
        BT_ASSERT_PRE_NON_NULL(component, "Component");
        BT_ASSERT_PRE_NON_NULL(name, "Name");
        BT_ASSERT_PRE(strlen(name) > 0, "Name is empty");
        graph = bt_component_borrow_graph(component);
-       BT_ASSERT_PRE(graph && !bt_graph_is_canceled(graph),
-               "Component's graph is canceled: %![comp-]+c, %![graph-]+g",
-               component, graph);
        BT_ASSERT_PRE(
                graph->config_state == BT_GRAPH_CONFIGURATION_STATE_CONFIGURING,
                "Component's graph is already configured: "
@@ -220,8 +221,8 @@ enum bt_self_component_status add_port(
 
        new_port = bt_port_create(component, port_type, name, user_data);
        if (!new_port) {
-               BT_LOGE_STR("Cannot create port object.");
-               status = BT_SELF_COMPONENT_STATUS_NOMEM;
+               BT_LIB_LOGE_APPEND_CAUSE("Cannot create port object.");
+               status = BT_FUNC_STATUS_MEMORY_ERROR;
                goto error;
        }
 
@@ -238,12 +239,12 @@ enum bt_self_component_status add_port(
         */
        graph = bt_component_borrow_graph(component);
        if (graph) {
-               enum bt_graph_listener_status listener_status;
+               enum bt_graph_listener_func_status listener_status;
 
                listener_status = bt_graph_notify_port_added(graph, new_port);
-               if (listener_status != BT_GRAPH_LISTENER_STATUS_OK) {
+               if (listener_status != BT_FUNC_STATUS_OK) {
                        bt_graph_make_faulty(graph);
-                       status = listener_status;
+                       status = (int) listener_status;
                        goto error;
                }
        }
@@ -252,7 +253,7 @@ enum bt_self_component_status add_port(
                "%![comp-]+c, %![port-]+p", component, new_port);
 
        *port = new_port;
-       status = BT_SELF_COMPONENT_STATUS_OK;
+       status = BT_FUNC_STATUS_OK;
 
        goto end;
 error:
@@ -269,20 +270,21 @@ end:
 BT_HIDDEN
 uint64_t bt_component_get_input_port_count(const struct bt_component *comp)
 {
-       BT_ASSERT_PRE_NON_NULL(comp, "Component");
+       BT_ASSERT_PRE_DEV_NON_NULL(comp, "Component");
        return (uint64_t) comp->input_ports->len;
 }
 
 BT_HIDDEN
 uint64_t bt_component_get_output_port_count(const struct bt_component *comp)
 {
-       BT_ASSERT_PRE_NON_NULL(comp, "Component");
+       BT_ASSERT_PRE_DEV_NON_NULL(comp, "Component");
        return (uint64_t) comp->output_ports->len;
 }
 
 BT_HIDDEN
 int bt_component_create(struct bt_component_class *component_class,
-               const char *name, struct bt_component **user_component)
+               const char *name, bt_logging_level log_level,
+               struct bt_component **user_component)
 {
        int ret = 0;
        struct bt_component *component = NULL;
@@ -293,10 +295,12 @@ int bt_component_create(struct bt_component_class *component_class,
        BT_ASSERT(name);
        type = bt_component_class_get_type(component_class);
        BT_LIB_LOGI("Creating empty component from component class: %![cc-]+C, "
-               "comp-name=\"%s\"", component_class, name);
+               "comp-name=\"%s\", log-level=%s", component_class, name,
+               bt_common_logging_level_string(log_level));
        component = component_create_funcs[type](component_class);
        if (!component) {
-               BT_LOGE_STR("Cannot create specific component object.");
+               BT_LIB_LOGE_APPEND_CAUSE(
+                       "Cannot create specific component object.");
                ret = -1;
                goto end;
        }
@@ -307,15 +311,16 @@ int bt_component_create(struct bt_component_class *component_class,
        component->destroy = component_destroy_funcs[type];
        component->name = g_string_new(name);
        if (!component->name) {
-               BT_LOGE_STR("Failed to allocate one GString.");
+               BT_LIB_LOGE_APPEND_CAUSE("Failed to allocate one GString.");
                ret = -1;
                goto end;
        }
 
+       component->log_level = log_level;
        component->input_ports = g_ptr_array_new_with_free_func(
                (GDestroyNotify) bt_object_try_spec_release);
        if (!component->input_ports) {
-               BT_LOGE_STR("Failed to allocate one GPtrArray.");
+               BT_LIB_LOGE_APPEND_CAUSE("Failed to allocate one GPtrArray.");
                ret = -1;
                goto end;
        }
@@ -323,7 +328,7 @@ int bt_component_create(struct bt_component_class *component_class,
        component->output_ports = g_ptr_array_new_with_free_func(
                (GDestroyNotify) bt_object_try_spec_release);
        if (!component->output_ports) {
-               BT_LOGE_STR("Failed to allocate one GPtrArray.");
+               BT_LIB_LOGE_APPEND_CAUSE("Failed to allocate one GPtrArray.");
                ret = -1;
                goto end;
        }
@@ -331,7 +336,7 @@ int bt_component_create(struct bt_component_class *component_class,
        component->destroy_listeners = g_array_new(FALSE, TRUE,
                sizeof(struct bt_component_destroy_listener));
        if (!component->destroy_listeners) {
-               BT_LOGE_STR("Failed to allocate one GArray.");
+               BT_LIB_LOGE_APPEND_CAUSE("Failed to allocate one GArray.");
                ret = -1;
                goto end;
        }
@@ -347,14 +352,14 @@ end:
 
 const char *bt_component_get_name(const struct bt_component *component)
 {
-       BT_ASSERT_PRE_NON_NULL(component, "Component");
+       BT_ASSERT_PRE_DEV_NON_NULL(component, "Component");
        return component->name->str;
 }
 
 const struct bt_component_class *bt_component_borrow_class_const(
                const struct bt_component *component)
 {
-       BT_ASSERT_PRE_NON_NULL(component, "Component");
+       BT_ASSERT_PRE_DEV_NON_NULL(component, "Component");
        return component->class;
 }
 
@@ -362,7 +367,7 @@ void *bt_self_component_get_data(const struct bt_self_component *self_comp)
 {
        struct bt_component *component = (void *) self_comp;
 
-       BT_ASSERT_PRE_NON_NULL(component, "Component");
+       BT_ASSERT_PRE_DEV_NON_NULL(component, "Component");
        return component->user_data;
 }
 
@@ -371,7 +376,7 @@ void bt_self_component_set_data(struct bt_self_component *self_comp,
 {
        struct bt_component *component = (void *) self_comp;
 
-       BT_ASSERT_PRE_NON_NULL(component, "Component");
+       BT_ASSERT_PRE_DEV_NON_NULL(component, "Component");
        component->user_data = data;
        BT_LIB_LOGD("Set component's user data: %!+c", component);
 }
@@ -384,12 +389,6 @@ void bt_component_set_graph(struct bt_component *component,
                graph ? &graph->base : NULL);
 }
 
-bt_bool bt_component_graph_is_canceled(const struct bt_component *component)
-{
-       return bt_graph_is_canceled(
-               (void *) bt_object_borrow_parent(&component->base));
-}
-
 static
 struct bt_port *borrow_port_by_name(GPtrArray *ports,
                const char *name)
@@ -402,7 +401,7 @@ struct bt_port *borrow_port_by_name(GPtrArray *ports,
        for (i = 0; i < ports->len; i++) {
                struct bt_port *port = g_ptr_array_index(ports, i);
 
-               if (!strcmp(name, port->name->str)) {
+               if (strcmp(name, port->name->str) == 0) {
                        ret_port = port;
                        break;
                }
@@ -423,7 +422,7 @@ BT_HIDDEN
 struct bt_port_output *bt_component_borrow_output_port_by_name(
                struct bt_component *comp, const char *name)
 {
-       BT_ASSERT_PRE_NON_NULL(comp, "Component");
+       BT_ASSERT_PRE_DEV_NON_NULL(comp, "Component");
        return (void *)
                borrow_port_by_name(comp->output_ports, name);
 }
@@ -439,8 +438,8 @@ BT_HIDDEN
 struct bt_port_input *bt_component_borrow_input_port_by_index(
                struct bt_component *comp, uint64_t index)
 {
-       BT_ASSERT_PRE_NON_NULL(comp, "Component");
-       BT_ASSERT_PRE_VALID_INDEX(index, comp->input_ports->len);
+       BT_ASSERT_PRE_DEV_NON_NULL(comp, "Component");
+       BT_ASSERT_PRE_DEV_VALID_INDEX(index, comp->input_ports->len);
        return (void *)
                borrow_port_by_index(comp->input_ports, index);
 }
@@ -449,14 +448,14 @@ BT_HIDDEN
 struct bt_port_output *bt_component_borrow_output_port_by_index(
                struct bt_component *comp, uint64_t index)
 {
-       BT_ASSERT_PRE_NON_NULL(comp, "Component");
-       BT_ASSERT_PRE_VALID_INDEX(index, comp->output_ports->len);
+       BT_ASSERT_PRE_DEV_NON_NULL(comp, "Component");
+       BT_ASSERT_PRE_DEV_VALID_INDEX(index, comp->output_ports->len);
        return (void *)
                borrow_port_by_index(comp->output_ports, index);
 }
 
 BT_HIDDEN
-enum bt_self_component_status bt_component_add_input_port(
+enum bt_self_component_add_port_status bt_component_add_input_port(
                struct bt_component *component, const char *name,
                void *user_data, struct bt_port **port)
 {
@@ -466,7 +465,7 @@ enum bt_self_component_status bt_component_add_input_port(
 }
 
 BT_HIDDEN
-enum bt_self_component_status bt_component_add_output_port(
+enum bt_self_component_add_port_status bt_component_add_output_port(
                struct bt_component *component, const char *name,
                void *user_data, struct bt_port **port)
 {
@@ -476,91 +475,16 @@ enum bt_self_component_status bt_component_add_output_port(
 }
 
 BT_HIDDEN
-enum bt_self_component_status bt_component_accept_port_connection(
+enum bt_component_class_port_connected_method_status
+bt_component_port_connected(
                struct bt_component *comp, struct bt_port *self_port,
                struct bt_port *other_port)
 {
-       typedef enum bt_self_component_status (*method_t)(
+       typedef enum bt_component_class_port_connected_method_status (*method_t)(
                void *, void *, const void *);
 
-       enum bt_self_component_status status = BT_SELF_COMPONENT_STATUS_OK;
-       method_t method = NULL;
-
-       BT_ASSERT(comp);
-       BT_ASSERT(self_port);
-       BT_ASSERT(other_port);
-
-       switch (comp->class->type) {
-       case BT_COMPONENT_CLASS_TYPE_SOURCE:
-       {
-               struct bt_component_class_source *src_cc = (void *) comp->class;
-
-               switch (self_port->type) {
-               case BT_PORT_TYPE_OUTPUT:
-                       method = (method_t) src_cc->methods.accept_output_port_connection;
-                       break;
-               default:
-                       abort();
-               }
-
-               break;
-       }
-       case BT_COMPONENT_CLASS_TYPE_FILTER:
-       {
-               struct bt_component_class_filter *flt_cc = (void *) comp->class;
-
-               switch (self_port->type) {
-               case BT_PORT_TYPE_INPUT:
-                       method = (method_t) flt_cc->methods.accept_input_port_connection;
-                       break;
-               case BT_PORT_TYPE_OUTPUT:
-                       method = (method_t) flt_cc->methods.accept_output_port_connection;
-                       break;
-               default:
-                       abort();
-               }
-
-               break;
-       }
-       case BT_COMPONENT_CLASS_TYPE_SINK:
-       {
-               struct bt_component_class_sink *sink_cc = (void *) comp->class;
-
-               switch (self_port->type) {
-               case BT_PORT_TYPE_INPUT:
-                       method = (method_t) sink_cc->methods.accept_input_port_connection;
-                       break;
-               default:
-                       abort();
-               }
-
-               break;
-       }
-       default:
-               abort();
-       }
-
-       if (method) {
-               BT_LIB_LOGD("Calling user's \"accept port connection\" method: "
-                       "%![comp-]+c, %![self-port-]+p, %![other-port-]+p",
-                       comp, self_port, other_port);
-               status = method(comp, self_port, (void *) other_port);
-               BT_LOGD("User method returned: status=%s",
-                       bt_self_component_status_string(status));
-       }
-
-       return status;
-}
-
-BT_HIDDEN
-enum bt_self_component_status bt_component_port_connected(
-               struct bt_component *comp, struct bt_port *self_port,
-               struct bt_port *other_port)
-{
-       typedef enum bt_self_component_status (*method_t)(
-               void *, void *, const void *);
-
-       enum bt_self_component_status status = BT_SELF_COMPONENT_STATUS_OK;
+       enum bt_component_class_port_connected_method_status status =
+               BT_FUNC_STATUS_OK;
        method_t method = NULL;
 
        BT_ASSERT(comp);
@@ -621,14 +545,14 @@ enum bt_self_component_status bt_component_port_connected(
                BT_LIB_LOGD("Calling user's \"port connected\" method: "
                        "%![comp-]+c, %![self-port-]+p, %![other-port-]+p",
                        comp, self_port, other_port);
-               status = method(comp, self_port, (void *) other_port);
+               status = (int) method(comp, self_port, (void *) other_port);
                BT_LOGD("User method returned: status=%s",
-                       bt_self_component_status_string(status));
-               BT_ASSERT_PRE(status == BT_SELF_COMPONENT_STATUS_OK ||
-                       status == BT_SELF_COMPONENT_STATUS_ERROR ||
-                       status == BT_SELF_COMPONENT_STATUS_NOMEM,
+                       bt_common_func_status_string(status));
+               BT_ASSERT_POST(status == BT_FUNC_STATUS_OK ||
+                       status == BT_FUNC_STATUS_ERROR ||
+                       status == BT_FUNC_STATUS_MEMORY_ERROR,
                        "Unexpected returned component status: status=%s",
-                       bt_self_component_status_string(status));
+                       bt_common_func_status_string(status));
        }
 
        return status;
@@ -674,6 +598,13 @@ void bt_component_remove_destroy_listener(struct bt_component *component,
        }
 }
 
+bt_logging_level bt_component_get_logging_level(
+               const struct bt_component *component)
+{
+       BT_ASSERT_PRE_DEV_NON_NULL(component, "Component");
+       return component->log_level;
+}
+
 void bt_component_get_ref(const struct bt_component *component)
 {
        bt_object_get_ref(component);
This page took 0.029878 seconds and 4 git commands to generate.