*/
#include <babeltrace2/types.h>
+/* For bt_logging_level */
+#include <babeltrace2/logging.h>
+
#ifdef __cplusplus
extern "C" {
#endif
*/
extern const char *bt_component_get_name(const bt_component *component);
+extern bt_logging_level bt_component_get_logging_level(
+ const bt_component *component);
+
/**
* Get component's class.
*
/* For bt_graph_status */
#include <babeltrace2/graph/graph-const.h>
+/* For bt_logging_level */
+#include <babeltrace2/logging.h>
+
#ifdef __cplusplus
extern "C" {
#endif
extern bt_graph_status bt_graph_add_source_component(bt_graph *graph,
const bt_component_class_source *component_class,
const char *name, const bt_value *params,
- const bt_component_source **component);
+ bt_logging_level log_level, const bt_component_source **component);
extern bt_graph_status bt_graph_add_source_component_with_init_method_data(
bt_graph *graph,
const bt_component_class_source *component_class,
const char *name, const bt_value *params,
- void *init_method_data,
+ void *init_method_data, bt_logging_level log_level,
const bt_component_source **component);
extern bt_graph_status bt_graph_add_filter_component(bt_graph *graph,
const bt_component_class_filter *component_class,
const char *name, const bt_value *params,
+ bt_logging_level log_level,
const bt_component_filter **component);
extern bt_graph_status bt_graph_add_filter_component_with_init_method_data(
bt_graph *graph,
const bt_component_class_filter *component_class,
const char *name, const bt_value *params,
- void *init_method_data,
+ void *init_method_data, bt_logging_level log_level,
const bt_component_filter **component);
extern bt_graph_status bt_graph_add_sink_component(
bt_graph *graph, const bt_component_class_sink *component_class,
const char *name, const bt_value *params,
+ bt_logging_level log_level,
const bt_component_sink **component);
extern bt_graph_status bt_graph_add_sink_component_with_init_method_data(
bt_graph *graph, const bt_component_class_sink *component_class,
const char *name, const bt_value *params,
- void *init_method_data,
+ void *init_method_data, bt_logging_level log_level,
const bt_component_sink **component);
extern bt_graph_status bt_graph_connect_ports(bt_graph *graph,
assert name is not None
return name
+ @property
+ def logging_level(self):
+ ptr = self._as_component_ptr(self._ptr)
+ return native_bt.component_get_logging_level(ptr)
+
@property
def cls(self):
cc_ptr = self._borrow_component_class_ptr(self._ptr)
assert name is not None
return name
+ @property
+ def logging_level(self):
+ ptr = self._as_not_self_specific_component_ptr(self._ptr)
+ ptr = self._as_component_ptr(ptr)
+ return native_bt.component_get_logging_level(ptr)
+
@property
def cls(self):
comp_ptr = self._as_not_self_specific_component_ptr(self._ptr)
import bt2.component
import functools
import bt2.port
+import bt2.logging
import bt2
elif status < 0:
raise bt2.Error(gen_error_msg)
- def add_component(self, component_class, name, params=None):
+ def add_component(self, component_class, name, params=None,
+ logging_level=bt2.logging.LoggingLevel.NONE):
if isinstance(component_class, bt2.component._GenericSourceComponentClass):
cc_ptr = component_class._ptr
add_fn = native_bt.graph_add_source_component
component_class.__class__.__name__))
utils._check_str(name)
+ utils._check_log_level(logging_level)
params = bt2.create_value(params)
params_ptr = params._ptr if params is not None else None
- status, comp_ptr = add_fn(self._ptr, cc_ptr, name, params_ptr)
+ status, comp_ptr = add_fn(self._ptr, cc_ptr, name,
+ params_ptr, logging_level)
self._handle_status(status, 'cannot add component to graph')
assert comp_ptr
return bt2.component._create_component_from_ptr(comp_ptr, cc_type)
extern const char *bt_component_get_name(const bt_component *component);
+extern bt_logging_level bt_component_get_logging_level(
+ const bt_component *component);
+
extern const bt_component_class *bt_component_borrow_class_const(
const bt_component *component);
extern bt_graph_status bt_graph_add_source_component(bt_graph *graph,
const bt_component_class_source *component_class,
const char *name, const bt_value *params,
- const bt_component_source **OUT);
+ bt_logging_level log_level, const bt_component_source **OUT);
extern bt_graph_status bt_graph_add_source_component_with_init_method_data(
bt_graph *graph,
const bt_component_class_source *component_class,
const char *name, const bt_value *params,
- void *init_method_data,
+ void *init_method_data, bt_logging_level log_level,
const bt_component_source **OUT);
extern bt_graph_status bt_graph_add_filter_component(bt_graph *graph,
const bt_component_class_filter *component_class,
const char *name, const bt_value *params,
+ bt_logging_level log_level,
const bt_component_filter **OUT);
extern bt_graph_status bt_graph_add_filter_component_with_init_method_data(
bt_graph *graph,
const bt_component_class_filter *component_class,
const char *name, const bt_value *params,
- void *init_method_data,
+ void *init_method_data, bt_logging_level log_level,
const bt_component_filter **OUT);
extern bt_graph_status bt_graph_add_sink_component(
bt_graph *graph, const bt_component_class_sink *component_class,
const char *name, const bt_value *params,
+ bt_logging_level log_level,
const bt_component_sink **OUT);
extern bt_graph_status bt_graph_add_sink_component_with_init_method_data(
bt_graph *graph, const bt_component_class_sink *component_class,
const char *name, const bt_value *params,
- void *init_method_data,
+ void *init_method_data, bt_logging_level log_level,
const bt_component_sink **OUT);
extern bt_graph_status bt_graph_connect_ports(bt_graph *graph,
status = BT_GRAPH_LISTENER_STATUS_ERROR;
goto end;
}
-
+
BT_ASSERT(py_res == Py_None);
status = BT_GRAPH_LISTENER_STATUS_OK;
status = BT_GRAPH_LISTENER_STATUS_NOMEM;
goto end;
}
-
+
py_downstream_component_ptr = SWIG_NewPointerObj(SWIG_as_voidptr(downstream_component),
downstream_component_swig_type, 0);
if (!py_downstream_component_ptr) {
status = BT_GRAPH_LISTENER_STATUS_ERROR;
goto end;
}
-
+
BT_ASSERT(py_res == Py_None);
status = BT_GRAPH_LISTENER_STATUS_OK;
class ComponentSpec:
- def __init__(self, plugin_name, class_name, params=None):
+ def __init__(self, plugin_name, class_name, params=None,
+ logging_level=bt2.logging.LoggingLevel.NONE):
utils._check_str(plugin_name)
utils._check_str(class_name)
+ utils._check_log_level(logging_level)
self._plugin_name = plugin_name
self._class_name = class_name
+ self._logging_level = logging_level
if type(params) is str:
self._params = bt2.create_value({'paths': [params]})
def class_name(self):
return self._class_name
+ @property
+ def logging_level(self):
+ return self._logging_level
+
@property
def params(self):
return self._params
comp_cls = comp_classes[comp_spec.class_name]
name = self._get_unique_comp_name(comp_spec)
- comp = self._graph.add_component(comp_cls, name, comp_spec.params)
+ comp = self._graph.add_component(comp_cls, name, comp_spec.params,
+ comp_spec.logging_level)
return comp
def _get_free_muxer_input_port(self):
# THE SOFTWARE.
import bt2
+import bt2.logging
def _check_bool(o):
def _handle_ptr(ptr, msg=None):
if ptr is None:
_raise_bt2_error(msg)
+
+
+def _check_log_level(log_level):
+ _check_int(log_level)
+
+ log_levels = (
+ bt2.logging.LoggingLevel.VERBOSE,
+ bt2.logging.LoggingLevel.DEBUG,
+ bt2.logging.LoggingLevel.INFO,
+ bt2.logging.LoggingLevel.WARN,
+ bt2.logging.LoggingLevel.ERROR,
+ bt2.logging.LoggingLevel.FATAL,
+ bt2.logging.LoggingLevel.NONE,
+ )
+
+ if log_level not in log_levels:
+ raise ValueError("'{}' is not a valid logging level".format(log_level))
ctx->connect_ports = false;
graph_status = bt_graph_add_filter_component(
ctx->graph, trimmer_class, trimmer_name,
- trimmer_params, &trimmer);
+ trimmer_params, ctx->cfg->log_level,
+ &trimmer);
free(trimmer_name);
if (graph_status != BT_GRAPH_STATUS_OK) {
goto error;
case BT_COMPONENT_CLASS_TYPE_SOURCE:
ret = bt_graph_add_source_component(ctx->graph,
comp_cls, cfg_comp->instance_name->str,
- cfg_comp->params,
+ cfg_comp->params, ctx->cfg->log_level,
(void *) &comp);
break;
case BT_COMPONENT_CLASS_TYPE_FILTER:
ret = bt_graph_add_filter_component(ctx->graph,
comp_cls, cfg_comp->instance_name->str,
- cfg_comp->params,
+ cfg_comp->params, ctx->cfg->log_level,
(void *) &comp);
break;
case BT_COMPONENT_CLASS_TYPE_SINK:
ret = bt_graph_add_sink_component(ctx->graph,
comp_cls, cfg_comp->instance_name->str,
- cfg_comp->params,
+ cfg_comp->params, ctx->cfg->log_level,
(void *) &comp);
break;
default:
#define BT_LOG_TAG "LIB/COMPONENT"
#include "lib/lib-logging.h"
+#include "common/common.h"
#include "common/assert.h"
#include "lib/assert-pre.h"
#include <babeltrace2/graph/self-component.h>
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;
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.");
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_logging_level bt_component_get_logging_level(
+ const struct bt_component *component)
+{
+ BT_ASSERT_PRE_NON_NULL(component, "Component");
+ return component->log_level;
+}
+
void bt_component_get_ref(const struct bt_component *component)
{
bt_object_get_ref(component);
#include <babeltrace2/graph/component-const.h>
#include "lib/object.h"
#include <babeltrace2/types.h>
+#include <babeltrace2/logging.h>
#include "common/assert.h"
#include <glib.h>
#include <stdio.h>
struct bt_object base;
struct bt_component_class *class;
GString *name;
+ bt_logging_level log_level;
/*
* Internal destroy function specific to a source, filter, or
BT_HIDDEN
int bt_component_create(struct bt_component_class *component_class,
- const char *name, struct bt_component **component);
+ const char *name, bt_logging_level log_level,
+ struct bt_component **component);
BT_HIDDEN
enum bt_self_component_status bt_component_accept_port_connection(
struct bt_component_class *comp_cls,
comp_init_method_t init_method,
const char *name, const struct bt_value *params,
- void *init_method_data, struct bt_component **user_component)
+ void *init_method_data, bt_logging_level log_level,
+ struct bt_component **user_component)
{
enum bt_graph_status graph_status = BT_GRAPH_STATUS_OK;
enum bt_self_component_status comp_status;
init_can_consume = graph->can_consume;
bt_graph_set_can_consume(graph, false);
BT_LIB_LOGI("Adding component to graph: "
- "%![graph-]+g, %![cc-]+C, name=\"%s\", %![params-]+v, "
- "init-method-data-addr=%p",
- graph, comp_cls, name, params, init_method_data);
+ "%![graph-]+g, %![cc-]+C, name=\"%s\", log-level=%s, "
+ "%![params-]+v, init-method-data-addr=%p",
+ graph, comp_cls, name,
+ bt_common_logging_level_string(log_level), params,
+ init_method_data);
if (!params) {
new_params = bt_value_map_create();
params = new_params;
}
- ret = bt_component_create(comp_cls, name, &component);
+ ret = bt_component_create(comp_cls, name, log_level, &component);
if (ret) {
BT_LOGE("Cannot create empty component object: ret=%d",
ret);
BT_LOGD_STR("Freezing component class.");
bt_component_class_freeze(comp_cls);
BT_LIB_LOGI("Added component to graph: "
- "%![graph-]+g, %![cc-]+C, name=\"%s\", %![params-]+v, "
- "init-method-data-addr=%p, %![comp-]+c",
- graph, comp_cls, name, params, init_method_data, component);
+ "%![graph-]+g, %![cc-]+C, name=\"%s\", log-level=%s, "
+ "%![params-]+v, init-method-data-addr=%p, %![comp-]+c",
+ graph, comp_cls, name,
+ bt_common_logging_level_string(log_level), params,
+ init_method_data, component);
if (user_component) {
/* Move reference to user */
struct bt_graph *graph,
const struct bt_component_class_source *comp_cls,
const char *name, const struct bt_value *params,
- void *init_method_data,
+ void *init_method_data, bt_logging_level log_level,
const struct bt_component_source **component)
{
BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class");
return add_component_with_init_method_data(graph,
(void *) comp_cls, (comp_init_method_t) comp_cls->methods.init,
- name, params, init_method_data, (void *) component);
+ name, params, init_method_data, log_level, (void *) component);
}
enum bt_graph_status bt_graph_add_source_component(
struct bt_graph *graph,
const struct bt_component_class_source *comp_cls,
const char *name, const struct bt_value *params,
+ bt_logging_level log_level,
const struct bt_component_source **component)
{
return bt_graph_add_source_component_with_init_method_data(
- graph, comp_cls, name, params, NULL, component);
+ graph, comp_cls, name, params, NULL, log_level, component);
}
enum bt_graph_status
struct bt_graph *graph,
const struct bt_component_class_filter *comp_cls,
const char *name, const struct bt_value *params,
- void *init_method_data,
+ void *init_method_data, bt_logging_level log_level,
const struct bt_component_filter **component)
{
BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class");
return add_component_with_init_method_data(graph,
(void *) comp_cls, (comp_init_method_t) comp_cls->methods.init,
- name, params, init_method_data, (void *) component);
+ name, params, init_method_data, log_level, (void *) component);
}
enum bt_graph_status bt_graph_add_filter_component(
struct bt_graph *graph,
const struct bt_component_class_filter *comp_cls,
const char *name, const struct bt_value *params,
+ bt_logging_level log_level,
const struct bt_component_filter **component)
{
return bt_graph_add_filter_component_with_init_method_data(
- graph, comp_cls, name, params, NULL, component);
+ graph, comp_cls, name, params, NULL, log_level, component);
}
enum bt_graph_status
struct bt_graph *graph,
const struct bt_component_class_sink *comp_cls,
const char *name, const struct bt_value *params,
- void *init_method_data,
+ void *init_method_data, bt_logging_level log_level,
const struct bt_component_sink **component)
{
BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class");
return add_component_with_init_method_data(graph,
(void *) comp_cls, (comp_init_method_t) comp_cls->methods.init,
- name, params, init_method_data, (void *) component);
+ name, params, init_method_data, log_level, (void *) component);
}
enum bt_graph_status bt_graph_add_sink_component(
struct bt_graph *graph,
const struct bt_component_class_sink *comp_cls,
const char *name, const struct bt_value *params,
+ bt_logging_level log_level,
const struct bt_component_sink **component)
{
return bt_graph_add_sink_component_with_init_method_data(
- graph, comp_cls, name, params, NULL, component);
+ graph, comp_cls, name, params, NULL, log_level, component);
}
BT_HIDDEN
colander_data.msgs = (void *) iterator->base.msgs->pdata;
colander_data.count_addr = &iterator->count;
- /* Hope that nobody uses this very unique name */
+ /*
+ * Hope that nobody uses this very unique name.
+ *
+ * We pass `BT_LOGGING_LEVEL_NONE` but the colander component
+ * class module does not use this level anyway since it belongs
+ * to the library.
+ */
graph_status =
bt_graph_add_sink_component_with_init_method_data(
(void *) graph, colander_comp_cls,
"colander-36ac3409-b1a8-4d60-ab1f-4fdf341a8fb1",
- NULL, &colander_data, (void *) &iterator->colander);
+ NULL, &colander_data, BT_LOGGING_LEVEL_NONE,
+ (void *) &iterator->colander);
if (graph_status != BT_GRAPH_STATUS_OK) {
BT_LIB_LOGW("Cannot add colander sink component to graph: "
"%1[graph-]+g, status=%s", graph,
{
char tmp_prefix[TMP_PREFIX_LEN];
- BUF_APPEND(", %sname=\"%s\"",
- PRFIELD_GSTRING(component->name));
+ BUF_APPEND(", %sname=\"%s\", %slog-level=%s",
+ PRFIELD_GSTRING(component->name),
+ PRFIELD(bt_common_logging_level_string(component->log_level)));
if (component->class) {
SET_TMP_PREFIX("class-");
int ret;
ret = bt_graph_add_source_component(graph, src_comp_class,
- "src-comp", NULL, &comp);
+ "src-comp", NULL, BT_LOGGING_LEVEL_NONE, &comp);
BT_ASSERT(ret == 0);
return comp;
}
int ret;
ret = bt_graph_add_sink_component(graph, sink_comp_class,
- "sink-comp", NULL, &comp);
+ "sink-comp", NULL, BT_LOGGING_LEVEL_NONE, &comp);
BT_ASSERT(ret == 0);
return comp;
}
graph = bt_graph_create();
BT_ASSERT(graph);
graph_ret = bt_graph_add_sink_component(graph, sink_comp_class,
- "the-sink", NULL, &sink_component);
+ "the-sink", NULL, BT_LOGGING_LEVEL_NONE, &sink_component);
ok(graph_ret == BT_GRAPH_STATUS_OK && sink_component,
"bt_graph_add_sink_component() still works after the plugin object is destroyed");
BT_COMPONENT_SINK_PUT_REF_AND_RESET(sink_component);
BT_ASSERT(ret == 0);
graph = bt_graph_create();
ret = bt_graph_add_source_component(graph, comp_cls, "src-comp",
- NULL, NULL);
+ NULL, BT_LOGGING_LEVEL_NONE, NULL);
BT_ASSERT(ret == 0);
bt_graph_put_ref(graph);
bt_component_class_source_put_ref(comp_cls);