#include <stdbool.h>
#include <inttypes.h>
#include <babeltrace/assert-internal.h>
+#include <babeltrace/common-internal.h>
#include <stdlib.h>
#include <string.h>
struct bt_private_component *priv_comp;
unsigned int next_port_num;
size_t available_input_ports;
- bool error;
bool initializing_muxer_notif_iter;
bool assume_absolute_clock_classes;
};
muxer_upstream_notif_iter,
muxer_upstream_notif_iter->notif_iter,
muxer_upstream_notif_iter->notifs->length);
- bt_put(muxer_upstream_notif_iter->notif_iter);
+ bt_object_put_ref(muxer_upstream_notif_iter->notif_iter);
if (muxer_upstream_notif_iter->notifs) {
struct bt_notification *notif;
while ((notif = g_queue_pop_head(
muxer_upstream_notif_iter->notifs))) {
- bt_put(notif);
+ bt_object_put_ref(notif);
}
g_queue_free(muxer_upstream_notif_iter->notifs);
goto end;
}
- muxer_upstream_notif_iter->notif_iter = bt_get(notif_iter);
+ muxer_upstream_notif_iter->notif_iter = bt_object_get_ref(notif_iter);
muxer_upstream_notif_iter->notifs = g_queue_new();
if (!muxer_upstream_notif_iter->notifs) {
BT_LOGE_STR("Failed to allocate a GQueue.");
}
static
-struct bt_value *get_default_params(void)
+struct bt_private_value *get_default_params(void)
{
- struct bt_value *params;
+ struct bt_private_value *params;
int ret;
- params = bt_value_map_create();
+ params = bt_private_value_map_create();
if (!params) {
BT_LOGE_STR("Cannot create a map value object.");
goto error;
}
- ret = bt_value_map_insert_bool(params,
+ ret = bt_private_value_map_insert_bool_entry(params,
ASSUME_ABSOLUTE_CLOCK_CLASSES_PARAM_NAME, false);
if (ret) {
BT_LOGE_STR("Cannot add boolean value to map value object.");
goto end;
error:
- BT_PUT(params);
+ BT_OBJECT_PUT_REF_AND_RESET(params);
end:
return params;
static
int configure_muxer_comp(struct muxer_comp *muxer_comp, struct bt_value *params)
{
- struct bt_value *default_params = NULL;
- struct bt_value *real_params = NULL;
+ struct bt_private_value *default_params = NULL;
+ struct bt_private_value *real_params = NULL;
struct bt_value *assume_absolute_clock_classes = NULL;
int ret = 0;
bt_bool bool_val;
goto error;
}
- real_params = bt_value_map_extend(default_params, params);
+ real_params = bt_value_map_extend(
+ bt_value_borrow_from_private(default_params), params);
if (!real_params) {
BT_LOGE("Cannot extend default parameters map value: "
"muxer-comp-addr=%p, def-params-addr=%p, "
goto error;
}
- assume_absolute_clock_classes = bt_value_map_borrow(real_params,
+ assume_absolute_clock_classes = bt_value_map_borrow_entry_value(
+ bt_value_borrow_from_private(real_params),
ASSUME_ABSOLUTE_CLOCK_CLASSES_PARAM_NAME);
if (assume_absolute_clock_classes &&
!bt_value_is_bool(assume_absolute_clock_classes)) {
BT_LOGE("Expecting a boolean value for the `%s` parameter: "
"muxer-comp-addr=%p, value-type=%s",
ASSUME_ABSOLUTE_CLOCK_CLASSES_PARAM_NAME, muxer_comp,
- bt_value_type_string(
+ bt_common_value_type_string(
bt_value_get_type(assume_absolute_clock_classes)));
goto error;
}
ret = -1;
end:
- bt_put(default_params);
- bt_put(real_params);
+ bt_object_put_ref(default_params);
+ bt_object_put_ref(real_params);
return ret;
}
port, bt_port_get_name(port), priv_conn, notif_iter);
end:
- bt_put(priv_conn);
+ bt_object_put_ref(priv_conn);
return notif_iter;
}
* won't be considered again to find the youngest
* notification.
*/
- BT_PUT(muxer_upstream_notif_iter->notif_iter);
+ BT_OBJECT_PUT_REF_AND_RESET(muxer_upstream_notif_iter->notif_iter);
status = BT_NOTIFICATION_ITERATOR_STATUS_OK;
break;
default:
muxer_notif_iter_add_upstream_notif_iter(
muxer_notif_iter, upstream_notif_iter,
priv_port);
- BT_PUT(upstream_notif_iter);
+ BT_OBJECT_PUT_REF_AND_RESET(upstream_notif_iter);
if (!muxer_upstream_notif_iter) {
/*
* muxer_notif_iter_add_upstream_notif_iter()
}
remove_node:
- bt_put(upstream_notif_iter);
+ bt_object_put_ref(upstream_notif_iter);
muxer_notif_iter->newly_connected_priv_ports =
g_list_delete_link(
muxer_notif_iter->newly_connected_priv_ports,
struct bt_notification *notif, int64_t last_returned_ts_ns,
int64_t *ts_ns)
{
- struct bt_clock_class_priority_map *cc_prio_map = NULL;
struct bt_clock_class *clock_class = NULL;
struct bt_clock_value *clock_value = NULL;
struct bt_event *event = NULL;
int ret = 0;
const unsigned char *cc_uuid;
const char *cc_name;
+ enum bt_clock_value_status cv_status = BT_CLOCK_VALUE_STATUS_KNOWN;
BT_ASSERT(notif);
BT_ASSERT(ts_ns);
switch (bt_notification_get_type(notif)) {
case BT_NOTIFICATION_TYPE_EVENT:
- cc_prio_map =
- bt_notification_event_borrow_clock_class_priority_map(
- notif);
+ event = bt_notification_event_borrow_event(notif);
+ BT_ASSERT(event);
+ cv_status = bt_event_borrow_default_clock_value(event,
+ &clock_value);
break;
case BT_NOTIFICATION_TYPE_INACTIVITY:
- cc_prio_map =
- bt_notification_inactivity_borrow_clock_class_priority_map(
+ clock_value =
+ bt_notification_inactivity_borrow_default_clock_value(
notif);
break;
default:
goto end;
}
- if (!cc_prio_map) {
- BT_LOGE("Cannot get notification's clock class priority map: "
- "notif-addr=%p", notif);
- goto error;
+ if (cv_status != BT_CLOCK_VALUE_STATUS_KNOWN) {
+ BT_LOGE_STR("Unsupported unknown clock value.");
+ ret = -1;
+ goto end;
}
/*
- * If the clock class priority map is empty, then we consider
- * that this notification has no time. In this case it's always
- * the youngest.
+ * If the clock value is missing, then we consider that this
+ * notification has no time. In this case it's always the
+ * youngest.
*/
- if (bt_clock_class_priority_map_get_clock_class_count(cc_prio_map) == 0) {
- BT_LOGV_STR("Notification's clock class priority map contains 0 clock classes: "
+ if (!clock_value) {
+ BT_LOGV_STR("Notification's default clock value is missing: "
"using the last returned timestamp.");
*ts_ns = last_returned_ts_ns;
goto end;
}
- clock_class =
- bt_clock_class_priority_map_borrow_highest_priority_clock_class(
- cc_prio_map);
- if (!clock_class) {
- BT_LOGE("Cannot get the clock class with the highest priority from clock class priority map: "
- "cc-prio-map-addr=%p", cc_prio_map);
- goto error;
- }
-
+ clock_class = bt_clock_value_borrow_clock_class(clock_value);
+ BT_ASSERT(clock_class);
cc_uuid = bt_clock_class_get_uuid(clock_class);
cc_name = bt_clock_class_get_name(clock_class);
}
}
- switch (bt_notification_get_type(notif)) {
- case BT_NOTIFICATION_TYPE_EVENT:
- event = bt_notification_event_borrow_event(notif);
- BT_ASSERT(event);
- clock_value = bt_event_borrow_clock_value(event,
- clock_class);
- break;
- case BT_NOTIFICATION_TYPE_INACTIVITY:
- clock_value = bt_notification_inactivity_borrow_clock_value(
- notif, clock_class);
- break;
- default:
- BT_LOGF("Unexpected notification type at this point: "
- "type=%d", bt_notification_get_type(notif));
- abort();
- }
-
- if (!clock_value) {
- BT_LOGE("Cannot get notification's clock value for clock class: "
- "clock-class-addr=%p, clock-class-name=\"%s\"",
- clock_class, cc_name);
- goto error;
- }
-
- ret = bt_clock_value_get_value_ns_from_epoch(clock_value, ts_ns);
+ ret = bt_clock_value_get_ns_from_origin(clock_value, ts_ns);
if (ret) {
BT_LOGE("Cannot get nanoseconds from Epoch of clock value: "
"clock-value-addr=%p", clock_value);
BT_LOGD("Skipping input port: not connected: "
"muxer-comp-addr=%p, port-addr=%p, port-name\"%s\"",
muxer_comp, port, bt_port_get_name(port));
- bt_put(priv_port);
+ bt_object_put_ref(priv_port);
continue;
}
- bt_put(priv_port);
+ bt_object_put_ref(priv_port);
muxer_notif_iter->newly_connected_priv_ports =
g_list_append(
muxer_notif_iter->newly_connected_priv_ports,
end:
muxer_comp->initializing_muxer_notif_iter = false;
- bt_put(priv_comp);
+ bt_object_put_ref(priv_comp);
return status;
}
destroy_muxer_notif_iter(muxer_notif_iter);
}
- bt_put(priv_comp);
+ bt_object_put_ref(priv_comp);
}
BT_HIDDEN
"notif-iter-addr=%p",
priv_comp, muxer_comp, muxer_notif_iter, priv_notif_iter);
- /* Are we in an error state set elsewhere? */
- if (unlikely(muxer_comp->error)) {
- BT_LOGE("Muxer component is already in an error state: returning BT_NOTIFICATION_ITERATOR_STATUS_ERROR: "
- "comp-addr=%p, muxer-comp-addr=%p, muxer-notif-iter-addr=%p, "
- "notif-iter-addr=%p",
- priv_comp, muxer_comp, muxer_notif_iter, priv_notif_iter);
- status = BT_NOTIFICATION_ITERATOR_STATUS_ERROR;
- goto end;
- }
-
status = muxer_notif_iter_do_next(muxer_comp, muxer_notif_iter,
notifs, capacity, count);
if (status < 0) {
bt_notification_iterator_status_string(status));
}
-end:
- bt_put(priv_comp);
+ bt_object_put_ref(priv_comp);
return status;
}
BT_HIDDEN
-void muxer_port_connected(
+enum bt_component_status muxer_port_connected(
struct bt_private_component *priv_comp,
struct bt_private_port *self_private_port,
struct bt_port *other_port)
{
+ enum bt_component_status status = BT_COMPONENT_STATUS_OK;
struct bt_port *self_port =
bt_port_borrow_from_private(self_private_port);
struct muxer_comp *muxer_comp =
"port-addr=%p, port-name=\"%s\", "
"muxer-notif-iter-addr=%p", self_port,
bt_port_get_name(self_port), muxer_notif_iter);
- muxer_comp->error = true;
+ status = BT_COMPONENT_STATUS_ERROR;
goto end;
}
BT_LOGE("Cannot ensure that at least one muxer component's input port is available: "
"muxer-comp-addr=%p, status=%s",
muxer_comp, bt_component_status_string(ret));
- muxer_comp->error = true;
+ status = BT_COMPONENT_STATUS_ERROR;
goto end;
}
end:
- return;
+ return status;
}
BT_HIDDEN