* THE SOFTWARE.
*/
-/* From component-class-const.h */
-
-typedef enum bt_component_class_status {
- BT_COMPONENT_CLASS_STATUS_OK = 0,
- BT_COMPONENT_CLASS_STATUS_NOMEM = -12,
-} bt_component_class_status;
-
-typedef enum bt_component_class_type {
- BT_COMPONENT_CLASS_TYPE_SOURCE = 0,
- BT_COMPONENT_CLASS_TYPE_FILTER = 1,
- BT_COMPONENT_CLASS_TYPE_SINK = 2,
-} bt_component_class_type;
-
-extern const char *bt_component_class_get_name(
- const bt_component_class *component_class);
-
-extern const char *bt_component_class_get_description(
- const bt_component_class *component_class);
-
-extern const char *bt_component_class_get_help(
- const bt_component_class *component_class);
-
-extern bt_component_class_type bt_component_class_get_type(
- const bt_component_class *component_class);
-
-bt_bool bt_component_class_is_source(
- const bt_component_class *component_class);
-
-bt_bool bt_component_class_is_filter(
- const bt_component_class *component_class);
-
-bt_bool bt_component_class_is_sink(
- const bt_component_class *component_class);
-
-extern void bt_component_class_get_ref(
- const bt_component_class *component_class);
-
-extern void bt_component_class_put_ref(
- const bt_component_class *component_class);
-
-/* From component-class-source-const.h */
-
-const bt_component_class *
-bt_component_class_source_as_component_class_const(
- const bt_component_class_source *comp_cls_source);
-
-extern void bt_component_class_source_get_ref(
- const bt_component_class_source *component_class_source);
-
-extern void bt_component_class_source_put_ref(
- const bt_component_class_source *component_class_source);
-
-/* From component-class-source.h */
-
-typedef bt_self_component_status
-(*bt_component_class_source_init_method)(
- bt_self_component_source *self_component,
- const bt_value *params, void *init_method_data);
-
-typedef void (*bt_component_class_source_finalize_method)(
- bt_self_component_source *self_component);
-
-typedef bt_self_message_iterator_status
-(*bt_component_class_source_message_iterator_init_method)(
- bt_self_message_iterator *message_iterator,
- bt_self_component_source *self_component,
- bt_self_component_port_output *port);
-
-typedef void
-(*bt_component_class_source_message_iterator_finalize_method)(
- bt_self_message_iterator *message_iterator);
-
-typedef bt_self_message_iterator_status
-(*bt_component_class_source_message_iterator_next_method)(
- bt_self_message_iterator *message_iterator,
- bt_message_array_const msgs, uint64_t capacity,
- uint64_t *count);
-
-typedef bt_self_message_iterator_status
-(*bt_component_class_source_message_iterator_seek_ns_from_origin_method)(
- bt_self_message_iterator *message_iterator,
- int64_t ns_from_origin);
-
-typedef bt_self_message_iterator_status
-(*bt_component_class_source_message_iterator_seek_beginning_method)(
- bt_self_message_iterator *message_iterator);
-
-typedef bt_bool
-(*bt_component_class_source_message_iterator_can_seek_ns_from_origin_method)(
- bt_self_message_iterator *message_iterator,
- int64_t ns_from_origin);
-
-typedef bt_bool
-(*bt_component_class_source_message_iterator_can_seek_beginning_method)(
- bt_self_message_iterator *message_iterator);
-
-typedef bt_query_status (*bt_component_class_source_query_method)(
- bt_self_component_class_source *comp_class,
- const bt_query_executor *query_executor,
- const char *object, const bt_value *params,
- const bt_value **result);
-
-typedef bt_self_component_status
-(*bt_component_class_source_accept_output_port_connection_method)(
- bt_self_component_source *self_component,
- bt_self_component_port_output *self_port,
- const bt_port_input *other_port);
-
-typedef bt_self_component_status
-(*bt_component_class_source_output_port_connected_method)(
- bt_self_component_source *self_component,
- bt_self_component_port_output *self_port,
- const bt_port_input *other_port);
-
-bt_component_class *bt_component_class_source_as_component_class(
- bt_component_class_source *comp_cls_source);
-
-extern
-bt_component_class_source *bt_component_class_source_create(
- const char *name,
- bt_component_class_source_message_iterator_next_method method);
-
-extern bt_component_class_status
-bt_component_class_source_set_init_method(
- bt_component_class_source *comp_class,
- bt_component_class_source_init_method method);
-
-extern bt_component_class_status
-bt_component_class_source_set_finalize_method(
- bt_component_class_source *comp_class,
- bt_component_class_source_finalize_method method);
-
-extern bt_component_class_status
-bt_component_class_source_set_accept_output_port_connection_method(
- bt_component_class_source *comp_class,
- bt_component_class_source_accept_output_port_connection_method method);
-
-extern bt_component_class_status
-bt_component_class_source_set_output_port_connected_method(
- bt_component_class_source *comp_class,
- bt_component_class_source_output_port_connected_method method);
-
-extern bt_component_class_status
-bt_component_class_source_set_query_method(
- bt_component_class_source *comp_class,
- bt_component_class_source_query_method method);
-
-extern bt_component_class_status
-bt_component_class_source_set_message_iterator_init_method(
- bt_component_class_source *comp_class,
- bt_component_class_source_message_iterator_init_method method);
-
-extern bt_component_class_status
-bt_component_class_source_set_message_iterator_finalize_method(
- bt_component_class_source *comp_class,
- bt_component_class_source_message_iterator_finalize_method method);
-
-extern bt_component_class_status
-bt_component_class_source_set_message_iterator_seek_ns_from_origin_method(
- bt_component_class_source *comp_class,
- bt_component_class_source_message_iterator_seek_ns_from_origin_method method);
-
-extern bt_component_class_status
-bt_component_class_source_set_message_iterator_seek_beginning_method(
- bt_component_class_source *comp_class,
- bt_component_class_source_message_iterator_seek_beginning_method method);
-
-extern bt_bool
-bt_component_class_source_set_message_iterator_can_seek_ns_from_origin_method(
- bt_component_class_source *comp_class,
- bt_component_class_source_message_iterator_can_seek_ns_from_origin_method method);
-
-extern bt_bool
-bt_component_class_source_set_message_iterator_can_seek_beginning_method(
- bt_component_class_source *comp_class,
- bt_component_class_source_message_iterator_can_seek_beginning_method method);
-
-/* From component-class-filter-const.h */
-
-const bt_component_class *
-bt_component_class_filter_as_component_class_const(
- const bt_component_class_filter *comp_cls_filter);
-
-extern void bt_component_class_filter_get_ref(
- const bt_component_class_filter *component_class_filter);
-
-extern void bt_component_class_filter_put_ref(
- const bt_component_class_filter *component_class_filter);
-
-/* From component-class-filter.h */
-
-typedef bt_self_component_status
-(*bt_component_class_filter_init_method)(
- bt_self_component_filter *self_component,
- const bt_value *params, void *init_method_data);
-
-typedef void (*bt_component_class_filter_finalize_method)(
- bt_self_component_filter *self_component);
-
-typedef bt_self_message_iterator_status
-(*bt_component_class_filter_message_iterator_init_method)(
- bt_self_message_iterator *message_iterator,
- bt_self_component_filter *self_component,
- bt_self_component_port_output *port);
-
-typedef void
-(*bt_component_class_filter_message_iterator_finalize_method)(
- bt_self_message_iterator *message_iterator);
-
-typedef bt_self_message_iterator_status
-(*bt_component_class_filter_message_iterator_next_method)(
- bt_self_message_iterator *message_iterator,
- bt_message_array_const msgs, uint64_t capacity,
- uint64_t *count);
-
-typedef bt_self_message_iterator_status
-(*bt_component_class_filter_message_iterator_seek_ns_from_origin_method)(
- bt_self_message_iterator *message_iterator,
- int64_t ns_from_origin);
-
-typedef bt_self_message_iterator_status
-(*bt_component_class_filter_message_iterator_seek_beginning_method)(
- bt_self_message_iterator *message_iterator);
-
-typedef bt_bool
-(*bt_component_class_filter_message_iterator_can_seek_ns_from_origin_method)(
- bt_self_message_iterator *message_iterator,
- int64_t ns_from_origin);
-
-typedef bt_bool
-(*bt_component_class_filter_message_iterator_can_seek_beginning_method)(
- bt_self_message_iterator *message_iterator);
-
-typedef bt_query_status
-(*bt_component_class_filter_query_method)(
- bt_self_component_class_filter *comp_class,
- const bt_query_executor *query_executor,
- const char *object, const bt_value *params,
- const bt_value **result);
-
-typedef bt_self_component_status
-(*bt_component_class_filter_accept_input_port_connection_method)(
- bt_self_component_filter *self_component,
- bt_self_component_port_input *self_port,
- const bt_port_output *other_port);
-
-typedef bt_self_component_status
-(*bt_component_class_filter_accept_output_port_connection_method)(
- bt_self_component_filter *self_component,
- bt_self_component_port_output *self_port,
- const bt_port_input *other_port);
-
-typedef bt_self_component_status
-(*bt_component_class_filter_input_port_connected_method)(
- bt_self_component_filter *self_component,
- bt_self_component_port_input *self_port,
- const bt_port_output *other_port);
-
-typedef bt_self_component_status
-(*bt_component_class_filter_output_port_connected_method)(
- bt_self_component_filter *self_component,
- bt_self_component_port_output *self_port,
- const bt_port_input *other_port);
-
-bt_component_class *bt_component_class_filter_as_component_class(
- bt_component_class_filter *comp_cls_filter);
-
-extern
-bt_component_class_filter *bt_component_class_filter_create(
- const char *name,
- bt_component_class_filter_message_iterator_next_method method);
-
-extern bt_component_class_status
-bt_component_class_filter_set_init_method(
- bt_component_class_filter *comp_class,
- bt_component_class_filter_init_method method);
-
-extern bt_component_class_status
-bt_component_class_filter_set_finalize_method(
- bt_component_class_filter *comp_class,
- bt_component_class_filter_finalize_method method);
-
-extern bt_component_class_status
-bt_component_class_filter_set_accept_input_port_connection_method(
- bt_component_class_filter *comp_class,
- bt_component_class_filter_accept_input_port_connection_method method);
-
-extern bt_component_class_status
-bt_component_class_filter_set_accept_output_port_connection_method(
- bt_component_class_filter *comp_class,
- bt_component_class_filter_accept_output_port_connection_method method);
-
-extern bt_component_class_status
-bt_component_class_filter_set_input_port_connected_method(
- bt_component_class_filter *comp_class,
- bt_component_class_filter_input_port_connected_method method);
-
-extern bt_component_class_status
-bt_component_class_filter_set_output_port_connected_method(
- bt_component_class_filter *comp_class,
- bt_component_class_filter_output_port_connected_method method);
-
-extern bt_component_class_status
-bt_component_class_filter_set_query_method(
- bt_component_class_filter *comp_class,
- bt_component_class_filter_query_method method);
-
-extern bt_component_class_status
-bt_component_class_filter_set_message_iterator_init_method(
- bt_component_class_filter *comp_class,
- bt_component_class_filter_message_iterator_init_method method);
-
-extern bt_component_class_status
-bt_component_class_filter_set_message_iterator_finalize_method(
- bt_component_class_filter *comp_class,
- bt_component_class_filter_message_iterator_finalize_method method);
-
-extern bt_component_class_status
-bt_component_class_filter_set_message_iterator_seek_ns_from_origin_method(
- bt_component_class_filter *comp_class,
- bt_component_class_filter_message_iterator_seek_ns_from_origin_method method);
-
-extern bt_component_class_status
-bt_component_class_filter_set_message_iterator_seek_beginning_method(
- bt_component_class_filter *comp_class,
- bt_component_class_filter_message_iterator_seek_beginning_method method);
-
-extern bt_bool
-bt_component_class_filter_set_message_iterator_can_seek_ns_from_origin_method(
- bt_component_class_filter *comp_class,
- bt_component_class_filter_message_iterator_can_seek_ns_from_origin_method method);
-
-extern bt_bool
-bt_component_class_filter_set_message_iterator_can_seek_beginning_method(
- bt_component_class_filter *comp_class,
- bt_component_class_filter_message_iterator_can_seek_beginning_method method);
-
-/* From component-class-sink-const.h */
-
-const bt_component_class *
-bt_component_class_sink_as_component_class_const(
- const bt_component_class_sink *comp_cls_sink);
-
-extern void bt_component_class_sink_get_ref(
- const bt_component_class_sink *component_class_sink);
-
-extern void bt_component_class_sink_put_ref(
- const bt_component_class_sink *component_class_sink);
-
-/* From component-class-sink.h */
-
-typedef bt_self_component_status (*bt_component_class_sink_init_method)(
- bt_self_component_sink *self_component,
- const bt_value *params, void *init_method_data);
-
-typedef void (*bt_component_class_sink_finalize_method)(
- bt_self_component_sink *self_component);
-
-typedef bt_query_status
-(*bt_component_class_sink_query_method)(
- bt_self_component_class_sink *comp_class,
- const bt_query_executor *query_executor,
- const char *object, const bt_value *params,
- const bt_value **result);
-
-typedef bt_self_component_status
-(*bt_component_class_sink_accept_input_port_connection_method)(
- bt_self_component_sink *self_component,
- bt_self_component_port_input *self_port,
- const bt_port_output *other_port);
-
-typedef bt_self_component_status
-(*bt_component_class_sink_input_port_connected_method)(
- bt_self_component_sink *self_component,
- bt_self_component_port_input *self_port,
- const bt_port_output *other_port);
-
-typedef bt_self_component_status
-(*bt_component_class_sink_graph_is_configured_method)(
- bt_self_component_sink *self_component);
-
-typedef bt_self_component_status (*bt_component_class_sink_consume_method)(
- bt_self_component_sink *self_component);
-
-bt_component_class *bt_component_class_sink_as_component_class(
- bt_component_class_sink *comp_cls_sink);
-
-extern
-bt_component_class_sink *bt_component_class_sink_create(
- const char *name,
- bt_component_class_sink_consume_method method);
-
-extern bt_component_class_status bt_component_class_sink_set_init_method(
- bt_component_class_sink *comp_class,
- bt_component_class_sink_init_method method);
-
-extern bt_component_class_status bt_component_class_sink_set_finalize_method(
- bt_component_class_sink *comp_class,
- bt_component_class_sink_finalize_method method);
-
-extern bt_component_class_status
-bt_component_class_sink_set_accept_input_port_connection_method(
- bt_component_class_sink *comp_class,
- bt_component_class_sink_accept_input_port_connection_method method);
-
-extern bt_component_class_status
-bt_component_class_sink_set_input_port_connected_method(
- bt_component_class_sink *comp_class,
- bt_component_class_sink_input_port_connected_method method);
-
-extern bt_component_class_status
-bt_component_class_sink_set_graph_is_configured_method(
- bt_component_class_sink *comp_class,
- bt_component_class_sink_graph_is_configured_method method);
-
-extern bt_component_class_status bt_component_class_sink_set_query_method(
- bt_component_class_sink *comp_class,
- bt_component_class_sink_query_method method);
-
-/* From self-component-class-source.h */
-
-const bt_component_class_source *
-bt_self_component_class_source_as_component_class_source(
- bt_self_component_class_source *self_comp_cls_source);
-
-/* From self-component-class-filter.h */
-
-const bt_component_class_filter *
-bt_self_component_class_filter_as_component_class_filter(
- bt_self_component_class_filter *self_comp_cls_filter);
-
-/* From self-component-class-sink.h */
-
-const bt_component_class_sink *
-bt_self_component_class_sink_as_component_class_sink(
- bt_self_component_class_sink *self_comp_cls_sink);
+%include <babeltrace2/graph/component-class-const.h>
+%include <babeltrace2/graph/component-class-source-const.h>
+%include <babeltrace2/graph/component-class-source.h>
+%include <babeltrace2/graph/component-class-filter-const.h>
+%include <babeltrace2/graph/component-class-filter.h>
+%include <babeltrace2/graph/component-class-sink-const.h>
+%include <babeltrace2/graph/component-class-sink.h>
+%include <babeltrace2/graph/self-component-class-source.h>
+%include <babeltrace2/graph/self-component-class-filter.h>
+%include <babeltrace2/graph/self-component-class-sink.h>
%{
/*
static GHashTable *bt_cc_ptr_to_py_cls;
-static void register_cc_ptr_to_py_cls(struct bt_component_class *bt_cc,
+static
+void register_cc_ptr_to_py_cls(struct bt_component_class *bt_cc,
PyObject *py_cls)
{
if (!bt_cc_ptr_to_py_cls) {
(gpointer) py_cls);
}
-static PyObject *lookup_cc_ptr_to_py_cls(const bt_component_class *bt_cc)
+static
+PyObject *lookup_cc_ptr_to_py_cls(const bt_component_class *bt_cc)
{
if (!bt_cc_ptr_to_py_cls) {
BT_LOGW("Cannot look up Python component class because hash table is NULL: "
static PyObject *py_mod_bt2_exc_error_type = NULL;
static PyObject *py_mod_bt2_exc_try_again_type = NULL;
static PyObject *py_mod_bt2_exc_stop_type = NULL;
-static PyObject *py_mod_bt2_exc_port_connection_refused_type = NULL;
static PyObject *py_mod_bt2_exc_msg_iter_canceled_type = NULL;
static PyObject *py_mod_bt2_exc_invalid_query_object_type = NULL;
static PyObject *py_mod_bt2_exc_invalid_query_params_type = NULL;
-static void bt_py3_cc_init_from_bt2(void)
+static
+void bt_py3_cc_init_from_bt2(void)
{
/*
* This is called once the bt2 package is loaded.
py_mod_bt2_exc_stop_type =
PyObject_GetAttrString(py_mod_bt2, "Stop");
BT_ASSERT(py_mod_bt2_exc_stop_type);
- py_mod_bt2_exc_port_connection_refused_type =
- PyObject_GetAttrString(py_mod_bt2, "PortConnectionRefused");
- BT_ASSERT(py_mod_bt2_exc_port_connection_refused_type);
py_mod_bt2_exc_invalid_query_object_type =
PyObject_GetAttrString(py_mod_bt2, "InvalidQueryObject");
BT_ASSERT(py_mod_bt2_exc_invalid_query_object_type);
BT_ASSERT(py_mod_bt2_exc_invalid_query_params_type);
}
-static void bt_py3_cc_exit_handler(void)
+static
+void bt_py3_cc_exit_handler(void)
{
/*
* This is an exit handler (set by the bt2 package).
Py_XDECREF(py_mod_bt2_exc_error_type);
Py_XDECREF(py_mod_bt2_exc_try_again_type);
Py_XDECREF(py_mod_bt2_exc_stop_type);
- Py_XDECREF(py_mod_bt2_exc_port_connection_refused_type);
Py_XDECREF(py_mod_bt2_exc_msg_iter_canceled_type);
Py_XDECREF(py_mod_bt2_exc_invalid_query_object_type);
Py_XDECREF(py_mod_bt2_exc_invalid_query_params_type);
/* Library destructor */
__attribute__((destructor))
-static void bt_py3_native_comp_class_dtor(void) {
+static
+void bt_py3_native_comp_class_dtor(void) {
/* Destroy component class association hash table */
if (bt_cc_ptr_to_py_cls) {
BT_LOGD_STR("Destroying native component class to Python component class hash table.");
}
}
-
-// TODO: maybe we can wrap code in the Python methods (e.g. _query_from_native)
-// in a try catch and print the error there instead, it would be simpler.
static
void bt2_py_loge_exception(void)
{
- PyObject *type = NULL;
- PyObject *value = NULL;
- PyObject *traceback = NULL;
- PyObject *traceback_module = NULL;
- PyObject *format_exception_func = NULL;
- PyObject *exc_str_list = NULL;
- GString *msg_buf = NULL;
- Py_ssize_t i;
+ GString *gstr;
BT_ASSERT(PyErr_Occurred() != NULL);
-
- PyErr_Fetch(&type, &value, &traceback);
-
- BT_ASSERT(type != NULL);
-
- /*
- * traceback can be NULL, when we fail to call a Python function from the
- * native code (there is not Python stack at that point). E.g.:
- *
- * TypeError: _accept_port_connection_from_native() takes 3 positional arguments but 4 were given
- */
-
-
- /* Make sure `value` is what we expected - an instance of `type`. */
- PyErr_NormalizeException(&type, &value, &traceback);
-
- traceback_module = PyImport_ImportModule("traceback");
- if (!traceback_module) {
- BT_LOGE_STR("Failed to log Python exception (could not import traceback module).");
+ gstr = bt_py_common_format_exception(BT_LOG_OUTPUT_LEVEL);
+ if (!gstr) {
+ /* bt_py_common_format_exception() logs errors */
goto end;
}
- format_exception_func = PyObject_GetAttrString(traceback_module,
- traceback ? "format_exception" : "format_exception_only");
- if (!format_exception_func) {
- BT_LOGE_STR("Failed to log Python exception (could not find format_exception).");
- goto end;
- }
-
- if (!PyCallable_Check(format_exception_func)) {
- BT_LOGE_STR("Failed to log Python exception (format_exception is not callable).");
- goto end;
- }
-
- exc_str_list = PyObject_CallFunctionObjArgs(format_exception_func, type, value, traceback, NULL);
- if (!exc_str_list) {
- PyErr_Print();
- BT_LOGE_STR("Failed to log Python exception (call to format_exception failed).");
- goto end;
- }
-
- msg_buf = g_string_new(NULL);
-
- for (i = 0; i < PyList_Size(exc_str_list); i++) {
- PyObject *exc_str = PyList_GetItem(exc_str_list, i);
- const char *str = PyUnicode_AsUTF8(exc_str);
- if (!str) {
- BT_LOGE_STR("Failed to log Python exception (failed to convert exception to string).");
- goto end;
- }
-
- g_string_append(msg_buf, str);
- }
-
- BT_LOGE_STR(msg_buf->str);
+ BT_LOGE_STR(gstr->str);
end:
- if (msg_buf) {
- g_string_free(msg_buf, TRUE);
+ if (gstr) {
+ g_string_free(gstr, TRUE);
}
- Py_XDECREF(exc_str_list);
- Py_XDECREF(format_exception_func);
- Py_XDECREF(traceback_module);
-
- /* PyErr_Restore takes our references. */
- PyErr_Restore(type, value, traceback);
}
-static bt_self_component_status bt_py3_exc_to_self_component_status(void)
+static
+bt_self_component_status bt_py3_exc_to_self_component_status(void)
{
bt_self_component_status status = BT_SELF_COMPONENT_STATUS_OK;
PyObject *exc = PyErr_Occurred();
} else if (PyErr_GivenExceptionMatches(exc,
py_mod_bt2_exc_stop_type)) {
status = BT_SELF_COMPONENT_STATUS_END;
- } else if (PyErr_GivenExceptionMatches(exc,
- py_mod_bt2_exc_port_connection_refused_type)) {
- status = BT_SELF_COMPONENT_STATUS_REFUSE_PORT_CONNECTION;
} else {
bt2_py_loge_exception();
status = BT_SELF_COMPONENT_STATUS_ERROR;
/* Component class proxy methods (delegate to the attached Python object) */
-static bt_self_message_iterator_status
-bt_py3_exc_to_self_message_iterator_status(void)
+static
+bt_self_message_iterator_status bt_py3_exc_to_self_message_iterator_status(void)
{
enum bt_self_message_iterator_status status =
BT_SELF_MESSAGE_ITERATOR_STATUS_OK;
return status;
}
-static enum bt_query_status bt_py3_exc_to_query_status(void)
+static
+enum bt_query_status bt_py3_exc_to_query_status(void)
{
enum bt_query_status status = BT_QUERY_STATUS_OK;
PyObject *exc = PyErr_Occurred();
return status;
}
-static bt_self_component_status
-bt_py3_component_class_init(
+static
+bt_self_component_status bt_py3_component_class_init(
bt_self_component *self_component,
void *self_component_v,
swig_type_info *self_comp_cls_type_swig_type,
* of that class.
*/
-static bt_self_component_status
-bt_py3_component_class_source_init(bt_self_component_source *self_component_source,
+static
+bt_self_component_status bt_py3_component_class_source_init(
+ bt_self_component_source *self_component_source,
const bt_value *params, void *init_method_data)
{
bt_self_component *self_component = bt_self_component_source_as_self_component(self_component_source);
params, init_method_data);
}
-static bt_self_component_status
-bt_py3_component_class_filter_init(bt_self_component_filter *self_component_filter,
+static
+bt_self_component_status bt_py3_component_class_filter_init(
+ bt_self_component_filter *self_component_filter,
const bt_value *params, void *init_method_data)
{
bt_self_component *self_component = bt_self_component_filter_as_self_component(self_component_filter);
params, init_method_data);
}
-static bt_self_component_status
-bt_py3_component_class_sink_init(bt_self_component_sink *self_component_sink,
+static
+bt_self_component_status bt_py3_component_class_sink_init(
+ bt_self_component_sink *self_component_sink,
const bt_value *params, void *init_method_data)
{
bt_self_component *self_component = bt_self_component_sink_as_self_component(self_component_sink);
params, init_method_data);
}
-static void bt_py3_component_class_finalize(bt_self_component *self_component)
+static
+void bt_py3_component_class_finalize(bt_self_component *self_component)
{
PyObject *py_comp = bt_self_component_get_data(self_component);
BT_ASSERT(py_comp);
Py_DECREF(py_comp);
}
-static void
-bt_py3_component_class_source_finalize(bt_self_component_source *self_component_source)
+static
+void bt_py3_component_class_source_finalize(bt_self_component_source *self_component_source)
{
bt_self_component *self_component = bt_self_component_source_as_self_component(self_component_source);
bt_py3_component_class_finalize(self_component);
}
-static void
-bt_py3_component_class_filter_finalize(bt_self_component_filter *self_component_filter)
+static
+void bt_py3_component_class_filter_finalize(bt_self_component_filter *self_component_filter)
{
bt_self_component *self_component = bt_self_component_filter_as_self_component(self_component_filter);
bt_py3_component_class_finalize(self_component);
}
-static void
-bt_py3_component_class_sink_finalize(bt_self_component_sink *self_component_sink)
+static
+void bt_py3_component_class_sink_finalize(bt_self_component_sink *self_component_sink)
{
bt_self_component *self_component = bt_self_component_sink_as_self_component(self_component_sink);
bt_py3_component_class_finalize(self_component);
}
-static bt_self_component_status
-bt_py3_component_class_accept_port_connection(
- bt_self_component *self_component,
- bt_self_component_port *self_component_port,
- bt_port_type self_component_port_type,
- const bt_port *other_port)
+static
+bt_bool bt_py3_component_class_can_seek_beginning(
+ bt_self_message_iterator *self_message_iterator)
{
- enum bt_self_component_status status;
- PyObject *py_comp = NULL;
- PyObject *py_self_port_ptr = NULL;
- PyObject *py_other_port_ptr = NULL;
- PyObject *py_method_result = NULL;
-
- py_comp = bt_self_component_get_data(self_component);
- BT_ASSERT(py_comp);
-
- swig_type_info *self_component_port_swig_type = NULL;
- swig_type_info *other_port_swig_type = NULL;
- switch (self_component_port_type) {
- case BT_PORT_TYPE_INPUT:
- self_component_port_swig_type = SWIGTYPE_p_bt_self_component_port_input;
- other_port_swig_type = SWIGTYPE_p_bt_port_output;
- break;
- case BT_PORT_TYPE_OUTPUT:
- self_component_port_swig_type = SWIGTYPE_p_bt_self_component_port_output;
- other_port_swig_type = SWIGTYPE_p_bt_port_input;
- break;
- }
- BT_ASSERT(self_component_port_swig_type != NULL);
- BT_ASSERT(other_port_swig_type != NULL);
-
- py_self_port_ptr = SWIG_NewPointerObj(SWIG_as_voidptr(self_component_port),
- self_component_port_swig_type, 0);
- if (!py_self_port_ptr) {
- BT_LOGE_STR("Failed to create a SWIG pointer object.");
- goto error;
- }
+ PyObject *py_iter;
+ PyObject *py_result = NULL;
+ bt_bool can_seek_beginning = false;
- py_other_port_ptr = SWIG_NewPointerObj(SWIG_as_voidptr(other_port),
- other_port_swig_type, 0);
- if (!py_other_port_ptr) {
- BT_LOGE_STR("Failed to create a SWIG pointer object.");
- goto error;
- }
+ py_iter = bt_self_message_iterator_get_data(self_message_iterator);
+ BT_ASSERT(py_iter);
- py_method_result = PyObject_CallMethod(py_comp,
- "_accept_port_connection_from_native", "(OiO)", py_self_port_ptr,
- self_component_port_type, py_other_port_ptr);
+ py_result = PyObject_GetAttrString(py_iter, "_can_seek_beginning_from_native");
- status = bt_py3_exc_to_self_component_status();
- if (!py_method_result && status == BT_SELF_COMPONENT_STATUS_OK) {
- /* Pretty sure this should never happen, but just in case */
- BT_LOGE("User's _accept_port_connection() method failed without raising an exception: "
- "status=%d", status);
- goto error;
- }
+ BT_ASSERT(!py_result || PyBool_Check(py_result));
- if (status == BT_SELF_COMPONENT_STATUS_REFUSE_PORT_CONNECTION) {
+ if (py_result) {
+ can_seek_beginning = PyObject_IsTrue(py_result);
+ } else {
/*
- * Looks like the user method raised
- * PortConnectionRefused: accept this like if it
- * returned False.
+ * Once can_seek_beginning can report errors, convert the
+ * exception to a status. For now, log and return false;
*/
- goto end;
- } else if (status != BT_SELF_COMPONENT_STATUS_OK) {
- BT_LOGE("User's _accept_port_connection() raised an unexpected exception: "
- "status=%d", status);
- goto error;
- }
-
- BT_ASSERT(PyBool_Check(py_method_result));
-
- if (py_method_result == Py_True) {
- status = BT_SELF_COMPONENT_STATUS_OK;
- } else {
- status = BT_SELF_COMPONENT_STATUS_REFUSE_PORT_CONNECTION;
+ bt2_py_loge_exception();
+ PyErr_Clear();
}
- goto end;
-
-error:
- status = BT_SELF_COMPONENT_STATUS_ERROR;
-
- /*
- * Clear any exception: we're returning a bad status anyway. If
- * this call originated from Python, then the user gets an
- * appropriate error.
- */
- PyErr_Clear();
+ Py_XDECREF(py_result);
-end:
- Py_XDECREF(py_self_port_ptr);
- Py_XDECREF(py_other_port_ptr);
- Py_XDECREF(py_method_result);
- return status;
+ return can_seek_beginning;
}
-static bt_self_component_status
-bt_py3_component_class_source_accept_output_port_connection(bt_self_component_source *self_component_source,
- bt_self_component_port_output *self_component_port_output,
- const bt_port_input *other_port_input)
+static
+bt_self_message_iterator_status bt_py3_component_class_seek_beginning(
+ bt_self_message_iterator *self_message_iterator)
{
- bt_self_component *self_component = bt_self_component_source_as_self_component(self_component_source);
- bt_self_component_port *self_component_port = bt_self_component_port_output_as_self_component_port(self_component_port_output);
- const bt_port *other_port = bt_port_input_as_port_const(other_port_input);
- return bt_py3_component_class_accept_port_connection(self_component, self_component_port, BT_PORT_TYPE_OUTPUT, other_port);
-}
+ PyObject *py_iter;
+ PyObject *py_result;
+ bt_self_message_iterator_status status;
-static bt_self_component_status
-bt_py3_component_class_filter_accept_input_port_connection(bt_self_component_filter *self_component_filter,
- bt_self_component_port_input *self_component_port_input,
- const bt_port_output *other_port_output)
-{
- bt_self_component *self_component = bt_self_component_filter_as_self_component(self_component_filter);
- bt_self_component_port *self_component_port = bt_self_component_port_input_as_self_component_port(self_component_port_input);
- const bt_port *other_port = bt_port_output_as_port_const(other_port_output);
- return bt_py3_component_class_accept_port_connection(self_component, self_component_port, BT_PORT_TYPE_INPUT, other_port);
-}
+ py_iter = bt_self_message_iterator_get_data(self_message_iterator);
+ BT_ASSERT(py_iter);
-static bt_self_component_status
-bt_py3_component_class_filter_accept_output_port_connection(bt_self_component_filter *self_component_filter,
- bt_self_component_port_output *self_component_port_output,
- const bt_port_input *other_port_input)
-{
- bt_self_component *self_component = bt_self_component_filter_as_self_component(self_component_filter);
- bt_self_component_port *self_component_port = bt_self_component_port_output_as_self_component_port(self_component_port_output);
- const bt_port *other_port = bt_port_input_as_port_const(other_port_input);
- return bt_py3_component_class_accept_port_connection(self_component, self_component_port, BT_PORT_TYPE_OUTPUT, other_port);
-}
+ py_result = PyObject_CallMethod(py_iter, "_seek_beginning_from_native", NULL);
-static bt_self_component_status
-bt_py3_component_class_sink_accept_input_port_connection(bt_self_component_sink *self_component_sink,
- bt_self_component_port_input *self_component_port_input,
- const bt_port_output *other_port_output)
-{
- bt_self_component *self_component = bt_self_component_sink_as_self_component(self_component_sink);
- bt_self_component_port *self_component_port = bt_self_component_port_input_as_self_component_port(self_component_port_input);
- const bt_port *other_port = bt_port_output_as_port_const(other_port_output);
- return bt_py3_component_class_accept_port_connection(self_component, self_component_port, BT_PORT_TYPE_INPUT, other_port);
+ BT_ASSERT(!py_result || py_result == Py_None);
+ status = bt_py3_exc_to_self_message_iterator_status();
+
+ Py_XDECREF(py_result);
+
+ return status;
}
-static bt_self_component_status
-bt_py3_component_class_port_connected(
+static
+bt_self_component_status bt_py3_component_class_port_connected(
bt_self_component *self_component,
void *self_component_port,
swig_type_info *self_component_port_swig_type,
return status;
}
-static bt_self_component_status
-bt_py3_component_class_source_output_port_connected(
+static
+bt_self_component_status bt_py3_component_class_source_output_port_connected(
bt_self_component_source *self_component_source,
bt_self_component_port_output *self_component_port_output,
const bt_port_input *other_port_input)
SWIGTYPE_p_bt_port_input);
}
-static bt_self_component_status
-bt_py3_component_class_filter_input_port_connected(
+static
+bt_self_component_status bt_py3_component_class_filter_input_port_connected(
bt_self_component_filter *self_component_filter,
bt_self_component_port_input *self_component_port_input,
const bt_port_output *other_port_output)
SWIGTYPE_p_bt_port_output);
}
-static bt_self_component_status
-bt_py3_component_class_filter_output_port_connected(
+static
+bt_self_component_status bt_py3_component_class_filter_output_port_connected(
bt_self_component_filter *self_component_filter,
bt_self_component_port_output *self_component_port_output,
const bt_port_input *other_port_input)
SWIGTYPE_p_bt_port_input);
}
-static bt_self_component_status
-bt_py3_component_class_sink_input_port_connected(
+static
+bt_self_component_status bt_py3_component_class_sink_input_port_connected(
bt_self_component_sink *self_component_sink,
bt_self_component_port_input *self_component_port_input,
const bt_port_output *other_port_output)
SWIGTYPE_p_bt_port_output);
}
-static bt_self_component_status
-bt_py3_component_class_sink_graph_is_configured(bt_self_component_sink *self_component_sink)
+static
+bt_self_component_status bt_py3_component_class_sink_graph_is_configured(
+ bt_self_component_sink *self_component_sink)
{
PyObject *py_comp = NULL;
PyObject *py_method_result = NULL;
return status;
}
-static bt_query_status
-bt_py3_component_class_query(
+static
+bt_query_status bt_py3_component_class_query(
const bt_component_class *component_class,
const bt_query_executor *query_executor,
const char *object, const bt_value *params,
+ bt_logging_level log_level,
const bt_value **result)
{
PyObject *py_cls = NULL;
}
py_results_addr = PyObject_CallMethod(py_cls,
- "_query_from_native", "(OOO)", py_query_exec_ptr,
- py_object, py_params_ptr);
+ "_query_from_native", "(OOOi)", py_query_exec_ptr,
+ py_object, py_params_ptr, (int) log_level);
if (!py_results_addr) {
BT_LOGE("Failed to call Python class's _query_from_native() method: "
return status;
}
-static bt_query_status
-bt_py3_component_class_source_query(
+static
+bt_query_status bt_py3_component_class_source_query(
bt_self_component_class_source *self_component_class_source,
const bt_query_executor *query_executor,
const char *object, const bt_value *params,
+ bt_logging_level log_level,
const bt_value **result)
{
const bt_component_class_source *component_class_source = bt_self_component_class_source_as_component_class_source(self_component_class_source);
const bt_component_class *component_class = bt_component_class_source_as_component_class_const(component_class_source);
- return bt_py3_component_class_query(component_class, query_executor, object, params, result);
+ return bt_py3_component_class_query(component_class, query_executor, object, params, log_level, result);
}
-static bt_query_status
-bt_py3_component_class_filter_query(
+static
+bt_query_status bt_py3_component_class_filter_query(
bt_self_component_class_filter *self_component_class_filter,
const bt_query_executor *query_executor,
const char *object, const bt_value *params,
+ bt_logging_level log_level,
const bt_value **result)
{
const bt_component_class_filter *component_class_filter = bt_self_component_class_filter_as_component_class_filter(self_component_class_filter);
const bt_component_class *component_class = bt_component_class_filter_as_component_class_const(component_class_filter);
- return bt_py3_component_class_query(component_class, query_executor, object, params, result);
+ return bt_py3_component_class_query(component_class, query_executor, object, params, log_level, result);
}
-static bt_query_status
-bt_py3_component_class_sink_query(
+static
+bt_query_status bt_py3_component_class_sink_query(
bt_self_component_class_sink *self_component_class_sink,
const bt_query_executor *query_executor,
const char *object, const bt_value *params,
+ bt_logging_level log_level,
const bt_value **result)
{
const bt_component_class_sink *component_class_sink = bt_self_component_class_sink_as_component_class_sink(self_component_class_sink);
const bt_component_class *component_class = bt_component_class_sink_as_component_class_const(component_class_sink);
- return bt_py3_component_class_query(component_class, query_executor, object, params, result);
+ return bt_py3_component_class_query(component_class, query_executor, object, params, log_level, result);
}
-static bt_self_message_iterator_status
-bt_py3_component_class_message_iterator_init(
+static
+bt_self_message_iterator_status bt_py3_component_class_message_iterator_init(
bt_self_message_iterator *self_message_iterator,
bt_self_component *self_component,
bt_self_component_port_output *self_component_port_output)
return status;
}
-static bt_self_message_iterator_status
-bt_py3_component_class_source_message_iterator_init(
+static
+bt_self_message_iterator_status bt_py3_component_class_source_message_iterator_init(
bt_self_message_iterator *self_message_iterator,
bt_self_component_source *self_component_source,
bt_self_component_port_output *self_component_port_output)
return bt_py3_component_class_message_iterator_init(self_message_iterator, self_component, self_component_port_output);
}
-static bt_self_message_iterator_status
-bt_py3_component_class_filter_message_iterator_init(
+static
+bt_self_message_iterator_status bt_py3_component_class_filter_message_iterator_init(
bt_self_message_iterator *self_message_iterator,
bt_self_component_filter *self_component_filter,
bt_self_component_port_output *self_component_port_output)
return bt_py3_component_class_message_iterator_init(self_message_iterator, self_component, self_component_port_output);
}
-static void
-bt_py3_component_class_message_iterator_finalize(
+static
+void bt_py3_component_class_message_iterator_finalize(
bt_self_message_iterator *message_iterator)
{
PyObject *py_message_iter = bt_self_message_iterator_get_data(message_iterator);
/* Valid for both sources and filters. */
-static bt_self_message_iterator_status
-bt_py3_component_class_message_iterator_next(
- bt_self_message_iterator *message_iterator,
- bt_message_array_const msgs, uint64_t capacity,
- uint64_t *count)
+static
+bt_self_message_iterator_status bt_py3_component_class_message_iterator_next(
+ bt_self_message_iterator *message_iterator,
+ bt_message_array_const msgs, uint64_t capacity,
+ uint64_t *count)
{
bt_self_message_iterator_status status = BT_SELF_MESSAGE_ITERATOR_STATUS_OK;
PyObject *py_message_iter = bt_self_message_iterator_get_data(message_iterator);
return status;
}
-static bt_self_component_status
-bt_py3_component_class_sink_consume(bt_self_component_sink *self_component_sink)
+static
+bt_self_component_status bt_py3_component_class_sink_consume(
+ bt_self_component_sink *self_component_sink)
{
bt_self_component *self_component = bt_self_component_sink_as_self_component(self_component_sink);
PyObject *py_comp = bt_self_component_get_data(self_component);
ret = bt_component_class_source_set_init_method(component_class_source, bt_py3_component_class_source_init);
BT_ASSERT(ret == 0);
- ret = bt_component_class_source_set_finalize_method (component_class_source, bt_py3_component_class_source_finalize);
+ ret = bt_component_class_source_set_finalize_method(component_class_source, bt_py3_component_class_source_finalize);
+ BT_ASSERT(ret == 0);
+ ret = bt_component_class_source_set_message_iterator_can_seek_beginning_method(component_class_source,
+ bt_py3_component_class_can_seek_beginning);
BT_ASSERT(ret == 0);
- ret = bt_component_class_source_set_accept_output_port_connection_method(component_class_source,
- bt_py3_component_class_source_accept_output_port_connection);
+ ret = bt_component_class_source_set_message_iterator_seek_beginning_method(component_class_source,
+ bt_py3_component_class_seek_beginning);
BT_ASSERT(ret == 0);
ret = bt_component_class_source_set_output_port_connected_method(component_class_source,
bt_py3_component_class_source_output_port_connected);
BT_ASSERT(ret == 0);
ret = bt_component_class_filter_set_finalize_method (component_class_filter, bt_py3_component_class_filter_finalize);
BT_ASSERT(ret == 0);
- ret = bt_component_class_filter_set_accept_input_port_connection_method(component_class_filter,
- bt_py3_component_class_filter_accept_input_port_connection);
+ ret = bt_component_class_filter_set_message_iterator_can_seek_beginning_method(component_class_filter,
+ bt_py3_component_class_can_seek_beginning);
BT_ASSERT(ret == 0);
- ret = bt_component_class_filter_set_accept_output_port_connection_method(component_class_filter,
- bt_py3_component_class_filter_accept_output_port_connection);
+ ret = bt_component_class_filter_set_message_iterator_seek_beginning_method(component_class_filter,
+ bt_py3_component_class_seek_beginning);
BT_ASSERT(ret == 0);
ret = bt_component_class_filter_set_input_port_connected_method(component_class_filter,
bt_py3_component_class_filter_input_port_connected);
BT_ASSERT(ret == 0);
ret = bt_component_class_sink_set_finalize_method(component_class_sink, bt_py3_component_class_sink_finalize);
BT_ASSERT(ret == 0);
- ret = bt_component_class_sink_set_accept_input_port_connection_method(component_class_sink,
- bt_py3_component_class_sink_accept_input_port_connection);
- BT_ASSERT(ret == 0);
ret = bt_component_class_sink_set_input_port_connected_method(component_class_sink,
bt_py3_component_class_sink_input_port_connected);
BT_ASSERT(ret == 0);