#include <stdint.h>
#include <stdbool.h>
-BT_HIDDEN
-int bt_stream_class_common_initialize(struct bt_stream_class_common *stream_class,
+static inline
+int bt_stream_class_initialize(struct bt_stream_class *stream_class,
const char *name, bt_object_release_func release_func)
{
- BT_LOGD("Initializing common stream class object: name=\"%s\"", name);
+ BT_LOGD("Initializing stream class object: name=\"%s\"", name);
bt_object_init_shared_with_parent(&stream_class->base, release_func);
stream_class->name = g_string_new(name);
goto error;
}
- BT_LOGD("Initialized common stream class object: addr=%p, name=\"%s\"",
+ BT_LOGD("Initialized stream class object: addr=%p, name=\"%s\"",
stream_class, name);
return 0;
return -1;
}
-BT_HIDDEN
-void bt_stream_class_common_finalize(struct bt_stream_class_common *stream_class)
+static
+void bt_stream_class_destroy(struct bt_object *obj)
{
- BT_LOGD("Finalizing common stream class: addr=%p, name=\"%s\", id=%" PRId64,
- stream_class, bt_stream_class_common_get_name(stream_class),
- bt_stream_class_common_get_id(stream_class));
+ struct bt_stream_class *stream_class = (void *) obj;
+
+ BT_LOGD("Destroying stream class: addr=%p, name=\"%s\", id=%" PRId64,
+ stream_class, bt_stream_class_get_name(stream_class),
+ bt_stream_class_get_id(stream_class));
bt_put(stream_class->clock_class);
if (stream_class->event_classes_ht) {
bt_put(stream_class->packet_context_field_type);
BT_LOGD_STR("Putting event context field type.");
bt_put(stream_class->event_context_field_type);
-}
-
-static
-void bt_stream_class_destroy(struct bt_object *obj)
-{
- struct bt_stream_class *stream_class;
-
- stream_class = (void *) obj;
- BT_LOGD("Destroying stream class: addr=%p, name=\"%s\", id=%" PRId64,
- stream_class, bt_stream_class_get_name(stream_class),
- bt_stream_class_get_id(stream_class));
-
- /*
- * IMPORTANT: Finalize the common stream class BEFORE finalizing
- * the pools because otherwise this scenario is possible:
- *
- * 1. Event header field object pool is finalized, thus
- * destroying its internal array and state.
- *
- * 2. Stream class is finalized: each event class is destroyed.
- *
- * 3. Destroying an event class finalizes its event pool,
- * destroying each contained event.
- *
- * 4. Destroying an event makes it recycle its event header
- * field to its stream class's event header field pool. But
- * said pool is already finalized.
- */
- bt_stream_class_common_finalize(BT_TO_COMMON(stream_class));
bt_object_pool_finalize(&stream_class->event_header_field_pool);
bt_object_pool_finalize(&stream_class->packet_context_field_pool);
g_free(stream_class);
goto error;
}
- ret = bt_stream_class_common_initialize(BT_TO_COMMON(stream_class),
- name, bt_stream_class_destroy);
+ ret = bt_stream_class_initialize(stream_class, name,
+ bt_stream_class_destroy);
if (ret) {
- /* bt_stream_class_common_initialize() logs errors */
+ /* bt_stream_class_initialize() logs errors */
goto error;
}
struct bt_field_wrapper *field_wrapper;
BT_ASSERT_PRE_NON_NULL(stream_class, "Stream class");
- BT_ASSERT_PRE(stream_class->common.frozen,
+ BT_ASSERT_PRE(stream_class->frozen,
"Stream class is not part of a trace: %!+S", stream_class);
- BT_ASSERT_PRE(stream_class->common.event_header_field_type,
+ BT_ASSERT_PRE(stream_class->event_header_field_type,
"Stream class has no event header field type: %!+S",
stream_class);
field_wrapper = bt_field_wrapper_create(
&stream_class->event_header_field_pool,
- (void *) stream_class->common.event_header_field_type);
+ (void *) stream_class->event_header_field_type);
if (!field_wrapper) {
BT_LIB_LOGE("Cannot allocate one event header field from stream class: "
"%![sc-]+S", stream_class);
struct bt_field_wrapper *field_wrapper;
BT_ASSERT_PRE_NON_NULL(stream_class, "Stream class");
- BT_ASSERT_PRE(stream_class->common.frozen,
+ BT_ASSERT_PRE(stream_class->frozen,
"Stream class is not part of a trace: %!+S", stream_class);
- BT_ASSERT_PRE(stream_class->common.packet_context_field_type,
+ BT_ASSERT_PRE(stream_class->packet_context_field_type,
"Stream class has no packet context field type: %!+S",
stream_class);
field_wrapper = bt_field_wrapper_create(
&stream_class->packet_context_field_pool,
- (void *) stream_class->common.packet_context_field_type);
+ (void *) stream_class->packet_context_field_type);
if (!field_wrapper) {
BT_LIB_LOGE("Cannot allocate one packet context field from stream class: "
"%![sc-]+S", stream_class);
struct bt_trace *bt_stream_class_borrow_trace(struct bt_stream_class *stream_class)
{
- return BT_FROM_COMMON(bt_stream_class_common_borrow_trace(
- BT_TO_COMMON(stream_class)));
+ BT_ASSERT(stream_class);
+ return (void *) bt_object_borrow_parent(&stream_class->base);
}
const char *bt_stream_class_get_name(struct bt_stream_class *stream_class)
{
- return bt_stream_class_common_get_name(BT_TO_COMMON(stream_class));
+ BT_ASSERT_PRE_NON_NULL(stream_class, "Stream class");
+ return stream_class->name->len > 0 ? stream_class->name->str : NULL;
}
int bt_stream_class_set_name(struct bt_stream_class *stream_class,
const char *name)
{
- return bt_stream_class_common_set_name(BT_TO_COMMON(stream_class),
- name);
+ int ret = 0;
+
+ if (!stream_class) {
+ BT_LOGW_STR("Invalid parameter: stream class is NULL.");
+ ret = -1;
+ goto end;
+ }
+
+ if (stream_class->frozen) {
+ BT_LOGW("Invalid parameter: stream class is frozen: "
+ "addr=%p, name=\"%s\", id=%" PRId64,
+ stream_class,
+ bt_stream_class_get_name(stream_class),
+ bt_stream_class_get_id(stream_class));
+ ret = -1;
+ goto end;
+ }
+
+ if (!name) {
+ g_string_assign(stream_class->name, "");
+ } else {
+ if (strlen(name) == 0) {
+ BT_LOGW("Invalid parameter: name is empty.");
+ ret = -1;
+ goto end;
+ }
+
+ g_string_assign(stream_class->name, name);
+ }
+
+ BT_LOGV("Set stream class's name: "
+ "addr=%p, name=\"%s\", id=%" PRId64,
+ stream_class, bt_stream_class_get_name(stream_class),
+ bt_stream_class_get_id(stream_class));
+end:
+ return ret;
}
int64_t bt_stream_class_get_id(struct bt_stream_class *stream_class)
{
- return bt_stream_class_common_get_id(BT_TO_COMMON(stream_class));
+ int64_t ret;
+
+ BT_ASSERT_PRE_NON_NULL(stream_class, "Stream class");
+
+ if (!stream_class->id_set) {
+ BT_LOGV("Stream class's ID is not set: addr=%p, name=\"%s\"",
+ stream_class,
+ bt_stream_class_get_name(stream_class));
+ ret = (int64_t) -1;
+ goto end;
+ }
+
+ ret = stream_class->id;
+
+end:
+ return ret;
}
-int bt_stream_class_set_id(struct bt_stream_class *stream_class, uint64_t id)
+int bt_stream_class_set_id(struct bt_stream_class *stream_class,
+ uint64_t id_param)
{
- return bt_stream_class_common_set_id(BT_TO_COMMON(stream_class), id);
+ int ret = 0;
+ int64_t id = (int64_t) id_param;
+
+ if (!stream_class) {
+ BT_LOGW_STR("Invalid parameter: stream class is NULL.");
+ ret = -1;
+ goto end;
+ }
+
+ if (stream_class->frozen) {
+ BT_LOGW("Invalid parameter: stream class is frozen: "
+ "addr=%p, name=\"%s\", id=%" PRId64,
+ stream_class,
+ bt_stream_class_get_name(stream_class),
+ bt_stream_class_get_id(stream_class));
+ ret = -1;
+ goto end;
+ }
+
+ if (id < 0) {
+ BT_LOGW("Invalid parameter: invalid stream class's ID: "
+ "stream-class-addr=%p, stream-class-name=\"%s\", "
+ "stream-class-id=%" PRId64 ", id=%" PRIu64,
+ stream_class,
+ bt_stream_class_get_name(stream_class),
+ bt_stream_class_get_id(stream_class),
+ id_param);
+ ret = -1;
+ goto end;
+ }
+
+ ret = bt_stream_class_set_id_no_check(stream_class, id);
+ if (ret == 0) {
+ BT_LOGV("Set stream class's ID: "
+ "addr=%p, name=\"%s\", id=%" PRId64,
+ stream_class,
+ bt_stream_class_get_name(stream_class),
+ bt_stream_class_get_id(stream_class));
+ }
+end:
+ return ret;
}
static
void event_class_exists(gpointer element, gpointer query)
{
- struct bt_event_class_common *event_class_a = element;
+ struct bt_event_class *event_class_a = element;
struct search_query *search_query = query;
- struct bt_event_class_common *event_class_b = search_query->value;
+ struct bt_event_class *event_class_b = search_query->value;
int64_t id_a, id_b;
if (search_query->value == element) {
* Two event classes cannot share the same ID in a given
* stream class.
*/
- id_a = bt_event_class_common_get_id(event_class_a);
- id_b = bt_event_class_common_get_id(event_class_b);
+ id_a = bt_event_class_get_id(event_class_a);
+ id_b = bt_event_class_get_id(event_class_b);
if (id_a < 0 || id_b < 0) {
/* at least one ID is not set: will be automatically set later */
if (id_a == id_b) {
BT_LOGW("Event class with this ID already exists in the stream class: "
"id=%" PRId64 ", name=\"%s\"",
- id_a, bt_event_class_common_get_name(event_class_a));
+ id_a, bt_event_class_get_name(event_class_a));
search_query->found = 1;
goto end;
}
return;
}
-BT_HIDDEN
-int bt_stream_class_common_add_event_class(
- struct bt_stream_class_common *stream_class,
- struct bt_event_class_common *event_class,
- bt_validation_flag_copy_field_type_func copy_field_type_func)
+int bt_stream_class_add_event_class(struct bt_stream_class *stream_class,
+ struct bt_event_class *event_class)
{
int ret = 0;
int64_t *event_id = NULL;
- struct bt_trace_common *trace = NULL;
- struct bt_stream_class_common *old_stream_class = NULL;
+ struct bt_trace *trace = NULL;
+ struct bt_stream_class *old_stream_class = NULL;
struct bt_validation_output validation_output = { 0 };
- struct bt_field_type_common *packet_header_type = NULL;
- struct bt_field_type_common *packet_context_type = NULL;
- struct bt_field_type_common *event_header_type = NULL;
- struct bt_field_type_common *stream_event_ctx_type = NULL;
- struct bt_field_type_common *event_context_type = NULL;
- struct bt_field_type_common *event_payload_type = NULL;
+ struct bt_field_type *packet_header_type = NULL;
+ struct bt_field_type *packet_context_type = NULL;
+ struct bt_field_type *event_header_type = NULL;
+ struct bt_field_type *stream_event_ctx_type = NULL;
+ struct bt_field_type *event_context_type = NULL;
+ struct bt_field_type *event_payload_type = NULL;
const enum bt_validation_flag validation_flags =
BT_VALIDATION_FLAG_EVENT;
struct bt_clock_class *expected_clock_class = NULL;
- BT_ASSERT(copy_field_type_func);
+ if (!stream_class) {
+ BT_LOGW("Invalid parameter: stream class is NULL: "
+ "stream-class-addr=%p", stream_class);
+ ret = -1;
+ goto end;
+ }
+
+ trace = bt_stream_class_borrow_trace(stream_class);
+ if (trace && trace->is_static) {
+ BT_LOGW("Invalid parameter: stream class's trace is static: "
+ "trace-addr=%p, trace-name=\"%s\"",
+ trace, bt_trace_get_name(trace));
+ ret = -1;
+ goto end;
+ }
if (!stream_class || !event_class) {
BT_LOGW("Invalid parameter: stream class or event class is NULL: "
"stream-class-addr=%p, stream-class-name=\"%s\", "
"stream-class-id=%" PRId64 ", event-class-addr=%p, "
"event-class-name=\"%s\", event-class-id=%" PRId64,
- stream_class, bt_stream_class_common_get_name(stream_class),
- bt_stream_class_common_get_id(stream_class),
+ stream_class, bt_stream_class_get_name(stream_class),
+ bt_stream_class_get_id(stream_class),
event_class,
- bt_event_class_common_get_name(event_class),
- bt_event_class_common_get_id(event_class));
- trace = bt_stream_class_common_borrow_trace(stream_class);
+ bt_event_class_get_name(event_class),
+ bt_event_class_get_id(event_class));
+ trace = bt_stream_class_borrow_trace(stream_class);
if (stream_class->frozen) {
/*
* and bt_event_class_validate_single_clock_class()
* below can set it.
*/
- ret = bt_event_class_common_validate_single_clock_class(
+ ret = bt_event_class_validate_single_clock_class(
event_class, &expected_clock_class);
if (ret) {
BT_LOGW("Event class contains a field type which is not "
"expected-clock-class-addr=%p, "
"expected-clock-class-name=\"%s\"",
stream_class,
- bt_stream_class_common_get_id(stream_class),
- bt_stream_class_common_get_name(stream_class),
+ bt_stream_class_get_id(stream_class),
+ bt_stream_class_get_name(stream_class),
expected_clock_class,
expected_clock_class ?
bt_clock_class_get_name(expected_clock_class) :
goto end;
}
- old_stream_class = bt_event_class_common_borrow_stream_class(event_class);
+ old_stream_class = bt_event_class_borrow_stream_class(event_class);
if (old_stream_class) {
/* Event class is already associated to a stream class. */
BT_LOGW("Event class is already part of another stream class: "
"event-class-stream-class-name=\"%s\", "
"event-class-stream-class-id=%" PRId64,
old_stream_class,
- bt_stream_class_common_get_name(old_stream_class),
- bt_stream_class_common_get_id(old_stream_class));
+ bt_stream_class_get_name(old_stream_class),
+ bt_stream_class_get_id(old_stream_class));
ret = -1;
goto end;
}
BT_ASSERT(trace->valid);
BT_ASSERT(stream_class->valid);
packet_header_type =
- bt_trace_common_borrow_packet_header_field_type(trace);
+ bt_trace_borrow_packet_header_field_type(trace);
packet_context_type =
- bt_stream_class_common_borrow_packet_context_field_type(
+ bt_stream_class_borrow_packet_context_field_type(
stream_class);
event_header_type =
- bt_stream_class_common_borrow_event_header_field_type(
+ bt_stream_class_borrow_event_header_field_type(
stream_class);
stream_event_ctx_type =
- bt_stream_class_common_borrow_event_context_field_type(
+ bt_stream_class_borrow_event_context_field_type(
stream_class);
event_context_type =
- bt_event_class_common_borrow_context_field_type(
+ bt_event_class_borrow_context_field_type(
event_class);
event_payload_type =
- bt_event_class_common_borrow_payload_field_type(
+ bt_event_class_borrow_payload_field_type(
event_class);
ret = bt_validate_class_types(
trace->environment, packet_header_type,
event_payload_type, trace->valid,
stream_class->valid, event_class->valid,
&validation_output, validation_flags,
- copy_field_type_func);
+ bt_field_type_copy);
if (ret) {
/*
}
/* Only set an event ID if none was explicitly set before */
- *event_id = bt_event_class_common_get_id(event_class);
+ *event_id = bt_event_class_get_id(event_class);
if (*event_id < 0) {
BT_LOGV("Event class has no ID: automatically setting it: "
"id=%" PRId64, stream_class->next_event_id);
- if (bt_event_class_common_set_id(event_class,
+ if (bt_event_class_set_id(event_class,
stream_class->next_event_id)) {
BT_LOGE("Cannot set event class's ID: id=%" PRId64,
stream_class->next_event_id);
event_id = NULL;
/* Freeze the event class */
- bt_event_class_common_freeze(event_class);
+ bt_event_class_freeze(event_class);
/*
* It is safe to set the stream class's unique clock class
BT_MOVE(stream_class->clock_class, expected_clock_class);
}
+ /* Notifiy listeners of the trace's schema modification. */
+ if (trace) {
+ struct bt_visitor_object obj = { .object = event_class,
+ .type = BT_VISITOR_OBJECT_TYPE_EVENT_CLASS };
+
+ (void) bt_trace_object_modification(&obj, trace);
+ }
+
BT_LOGD("Added event class to stream class: "
"stream-class-addr=%p, stream-class-name=\"%s\", "
"stream-class-id=%" PRId64 ", event-class-addr=%p, "
"event-class-name=\"%s\", event-class-id=%" PRId64,
- stream_class, bt_stream_class_common_get_name(stream_class),
- bt_stream_class_common_get_id(stream_class),
+ stream_class, bt_stream_class_get_name(stream_class),
+ bt_stream_class_get_id(stream_class),
event_class,
- bt_event_class_common_get_name(event_class),
- bt_event_class_common_get_id(event_class));
+ bt_event_class_get_name(event_class),
+ bt_event_class_get_id(event_class));
end:
bt_validation_output_put_types(&validation_output);
return ret;
}
-int bt_stream_class_add_event_class(struct bt_stream_class *stream_class,
- struct bt_event_class *event_class)
+int64_t bt_stream_class_get_event_class_count(
+ struct bt_stream_class *stream_class)
{
- struct bt_trace *trace;
- int ret = 0;
+ int64_t ret;
if (!stream_class) {
- BT_LOGW("Invalid parameter: stream class is NULL: "
- "stream-class-addr=%p", stream_class);
- ret = -1;
- goto end;
- }
-
- trace = BT_FROM_COMMON(bt_stream_class_common_borrow_trace(
- BT_TO_COMMON(stream_class)));
- if (trace && trace->is_static) {
- BT_LOGW("Invalid parameter: stream class's trace is static: "
- "trace-addr=%p, trace-name=\"%s\"",
- trace, bt_trace_get_name(trace));
- ret = -1;
- goto end;
- }
-
- ret = bt_stream_class_common_add_event_class(
- BT_TO_COMMON(stream_class), BT_TO_COMMON(event_class),
- (bt_validation_flag_copy_field_type_func) bt_field_type_copy);
- if (ret) {
+ BT_LOGW_STR("Invalid parameter: stream class is NULL.");
+ ret = (int64_t) -1;
goto end;
}
- /* Notifiy listeners of the trace's schema modification. */
- if (trace) {
- struct bt_visitor_object obj = { .object = event_class,
- .type = BT_VISITOR_OBJECT_TYPE_EVENT_CLASS };
-
- (void) bt_trace_object_modification(&obj, trace);
- }
-
+ ret = (int64_t) stream_class->event_classes->len;
end:
return ret;
}
-int64_t bt_stream_class_get_event_class_count(
- struct bt_stream_class *stream_class)
-{
- return bt_stream_class_common_get_event_class_count(
- BT_TO_COMMON(stream_class));
-}
-
struct bt_event_class *bt_stream_class_borrow_event_class_by_index(
struct bt_stream_class *stream_class, uint64_t index)
{
- return BT_FROM_COMMON(bt_stream_class_common_borrow_event_class_by_index(
- BT_TO_COMMON(stream_class), index));
+ BT_ASSERT_PRE_NON_NULL(stream_class, "Stream class");
+ BT_ASSERT_PRE(index < stream_class->event_classes->len,
+ "Index is out of bounds: index=%" PRIu64 ", "
+ "count=%u",
+ index, stream_class->event_classes->len);
+ return g_ptr_array_index(stream_class->event_classes, index);
}
struct bt_event_class *bt_stream_class_borrow_event_class_by_id(
struct bt_stream_class *stream_class, uint64_t id)
{
- return BT_FROM_COMMON(bt_stream_class_common_borrow_event_class_by_id(
- BT_TO_COMMON(stream_class), id));
+ int64_t id_key = (int64_t) id;
+
+ BT_ASSERT_PRE_NON_NULL(stream_class, "Stream class");
+ BT_ASSERT_PRE(id_key >= 0,
+ "Invalid event class ID: %" PRIu64, id);
+ return g_hash_table_lookup(stream_class->event_classes_ht,
+ &id_key);
}
struct bt_field_type *bt_stream_class_borrow_packet_context_field_type(
struct bt_stream_class *stream_class)
{
- return BT_FROM_COMMON(bt_stream_class_common_borrow_packet_context_field_type(
- BT_TO_COMMON(stream_class)));
+ BT_ASSERT_PRE_NON_NULL(stream_class, "Stream class");
+ return stream_class->packet_context_field_type;
}
int bt_stream_class_set_packet_context_field_type(
struct bt_stream_class *stream_class,
struct bt_field_type *packet_context_type)
{
- return bt_stream_class_common_set_packet_context_field_type(
- BT_TO_COMMON(stream_class), (void *) packet_context_type);
+ int ret = 0;
+
+ if (!stream_class) {
+ BT_LOGW_STR("Invalid parameter: stream class is NULL.");
+ ret = -1;
+ goto end;
+ }
+
+ if (stream_class->frozen) {
+ BT_LOGW("Invalid parameter: stream class is frozen: "
+ "addr=%p, name=\"%s\", id=%" PRId64,
+ stream_class, bt_stream_class_get_name(stream_class),
+ bt_stream_class_get_id(stream_class));
+ ret = -1;
+ goto end;
+ }
+
+ if (packet_context_type &&
+ bt_field_type_get_type_id(packet_context_type) !=
+ BT_FIELD_TYPE_ID_STRUCT) {
+ /* A packet context must be a structure. */
+ BT_LOGW("Invalid parameter: stream class's packet context field type must be a structure: "
+ "addr=%p, name=\"%s\", id=%" PRId64 ", "
+ "packet-context-ft-addr=%p, packet-context-ft-id=%s",
+ stream_class, bt_stream_class_get_name(stream_class),
+ bt_stream_class_get_id(stream_class),
+ packet_context_type,
+ bt_common_field_type_id_string(
+ bt_field_type_get_type_id(packet_context_type)));
+ ret = -1;
+ goto end;
+ }
+
+ bt_put(stream_class->packet_context_field_type);
+ bt_get(packet_context_type);
+ stream_class->packet_context_field_type = packet_context_type;
+ BT_LOGV("Set stream class's packet context field type: "
+ "addr=%p, name=\"%s\", id=%" PRId64 ", "
+ "packet-context-ft-addr=%p",
+ stream_class, bt_stream_class_get_name(stream_class),
+ bt_stream_class_get_id(stream_class),
+ packet_context_type);
+
+end:
+ return ret;
}
struct bt_field_type *bt_stream_class_borrow_event_header_field_type(
struct bt_stream_class *stream_class)
{
- return BT_FROM_COMMON(bt_stream_class_common_borrow_event_header_field_type(
- BT_TO_COMMON(stream_class)));
+ struct bt_field_type *ret = NULL;
+
+ BT_ASSERT_PRE_NON_NULL(stream_class, "Stream class");
+
+ if (!stream_class->event_header_field_type) {
+ BT_LOGV("Stream class has no event header field type: "
+ "addr=%p, name=\"%s\", id=%" PRId64,
+ stream_class,
+ bt_stream_class_get_name(stream_class),
+ bt_stream_class_get_id(stream_class));
+ goto end;
+ }
+
+ ret = stream_class->event_header_field_type;
+
+end:
+ return ret;
}
int bt_stream_class_set_event_header_field_type(
struct bt_stream_class *stream_class,
struct bt_field_type *event_header_type)
{
- return bt_stream_class_common_set_event_header_field_type(
- BT_TO_COMMON(stream_class), (void *) event_header_type);
+ int ret = 0;
+
+ if (!stream_class) {
+ BT_LOGW_STR("Invalid parameter: stream class is NULL.");
+ ret = -1;
+ goto end;
+ }
+
+ if (stream_class->frozen) {
+ BT_LOGW("Invalid parameter: stream class is frozen: "
+ "addr=%p, name=\"%s\", id=%" PRId64,
+ stream_class,
+ bt_stream_class_get_name(stream_class),
+ bt_stream_class_get_id(stream_class));
+ ret = -1;
+ goto end;
+ }
+
+ if (event_header_type &&
+ bt_field_type_get_type_id(event_header_type) !=
+ BT_FIELD_TYPE_ID_STRUCT) {
+ /* An event header must be a structure. */
+ BT_LOGW("Invalid parameter: stream class's event header field type must be a structure: "
+ "addr=%p, name=\"%s\", id=%" PRId64 ", "
+ "event-header-ft-addr=%p, event-header-ft-id=%s",
+ stream_class, bt_stream_class_get_name(stream_class),
+ bt_stream_class_get_id(stream_class),
+ event_header_type,
+ bt_common_field_type_id_string(
+ bt_field_type_get_type_id(event_header_type)));
+ ret = -1;
+ goto end;
+ }
+
+ bt_put(stream_class->event_header_field_type);
+ stream_class->event_header_field_type = bt_get(event_header_type);
+ BT_LOGV("Set stream class's event header field type: "
+ "addr=%p, name=\"%s\", id=%" PRId64 ", "
+ "event-header-ft-addr=%p",
+ stream_class, bt_stream_class_get_name(stream_class),
+ bt_stream_class_get_id(stream_class),
+ event_header_type);
+end:
+ return ret;
}
struct bt_field_type *bt_stream_class_borrow_event_context_field_type(
struct bt_stream_class *stream_class)
{
- return BT_FROM_COMMON(bt_stream_class_common_borrow_event_context_field_type(
- BT_TO_COMMON(stream_class)));
+ struct bt_field_type *ret = NULL;
+
+ BT_ASSERT_PRE_NON_NULL(stream_class, "Stream class");
+
+ if (!stream_class->event_context_field_type) {
+ goto end;
+ }
+
+ ret = stream_class->event_context_field_type;
+
+end:
+ return ret;
}
int bt_stream_class_set_event_context_field_type(
struct bt_stream_class *stream_class,
struct bt_field_type *event_context_type)
{
- return bt_stream_class_common_set_event_context_field_type(
- BT_TO_COMMON(stream_class), (void *) event_context_type);
+ int ret = 0;
+
+ if (!stream_class) {
+ BT_LOGW_STR("Invalid parameter: stream class is NULL.");
+ ret = -1;
+ goto end;
+ }
+
+ if (stream_class->frozen) {
+ BT_LOGW("Invalid parameter: stream class is frozen: "
+ "addr=%p, name=\"%s\", id=%" PRId64,
+ stream_class, bt_stream_class_get_name(stream_class),
+ bt_stream_class_get_id(stream_class));
+ ret = -1;
+ goto end;
+ }
+
+ if (event_context_type &&
+ bt_field_type_get_type_id(event_context_type) !=
+ BT_FIELD_TYPE_ID_STRUCT) {
+ /* A packet context must be a structure. */
+ BT_LOGW("Invalid parameter: stream class's event context field type must be a structure: "
+ "addr=%p, name=\"%s\", id=%" PRId64 ", "
+ "event-context-ft-addr=%p, event-context-ft-id=%s",
+ stream_class, bt_stream_class_get_name(stream_class),
+ bt_stream_class_get_id(stream_class),
+ event_context_type,
+ bt_common_field_type_id_string(
+ bt_field_type_get_type_id(event_context_type)));
+ ret = -1;
+ goto end;
+ }
+
+ bt_put(stream_class->event_context_field_type);
+ stream_class->event_context_field_type = bt_get(event_context_type);
+ BT_LOGV("Set stream class's event context field type: "
+ "addr=%p, name=\"%s\", id=%" PRId64 ", "
+ "event-context-ft-addr=%p",
+ stream_class, bt_stream_class_get_name(stream_class),
+ bt_stream_class_get_id(stream_class),
+ event_context_type);
+end:
+ return ret;
}
static
}
BT_HIDDEN
-int bt_stream_class_common_visit(struct bt_stream_class_common *stream_class,
+int bt_stream_class_visit(struct bt_stream_class *stream_class,
bt_visitor visitor, void *data)
{
int ret;
return ret;
}
-int bt_stream_class_visit(struct bt_stream_class *stream_class,
- bt_visitor visitor, void *data)
-{
- return bt_stream_class_common_visit(BT_FROM_COMMON(stream_class),
- visitor, data);
-}
-
BT_HIDDEN
-void bt_stream_class_common_freeze(struct bt_stream_class_common *stream_class)
+void bt_stream_class_freeze(struct bt_stream_class *stream_class)
{
if (!stream_class || stream_class->frozen) {
return;
}
BT_LOGD("Freezing stream class: addr=%p, name=\"%s\", id=%" PRId64,
- stream_class, bt_stream_class_common_get_name(stream_class),
- bt_stream_class_common_get_id(stream_class));
+ stream_class, bt_stream_class_get_name(stream_class),
+ bt_stream_class_get_id(stream_class));
stream_class->frozen = 1;
- bt_field_type_common_freeze(stream_class->event_header_field_type);
- bt_field_type_common_freeze(stream_class->packet_context_field_type);
- bt_field_type_common_freeze(stream_class->event_context_field_type);
+ bt_field_type_freeze(stream_class->event_header_field_type);
+ bt_field_type_freeze(stream_class->packet_context_field_type);
+ bt_field_type_freeze(stream_class->event_context_field_type);
bt_clock_class_freeze(stream_class->clock_class);
}
-void bt_stream_class_freeze(struct bt_stream_class *stream_class)
-{
- bt_stream_class_common_freeze(BT_TO_COMMON(stream_class));
-}
-
BT_HIDDEN
-int bt_stream_class_common_validate_single_clock_class(
- struct bt_stream_class_common *stream_class,
+int bt_stream_class_validate_single_clock_class(
+ struct bt_stream_class *stream_class,
struct bt_clock_class **expected_clock_class)
{
int ret;
BT_ASSERT(stream_class);
BT_ASSERT(expected_clock_class);
- ret = bt_field_type_common_validate_single_clock_class(
+ ret = bt_field_type_validate_single_clock_class(
stream_class->packet_context_field_type,
expected_clock_class);
if (ret) {
"stream-class-id=%" PRId64 ", "
"ft-addr=%p",
stream_class,
- bt_stream_class_common_get_name(stream_class),
+ bt_stream_class_get_name(stream_class),
stream_class->id,
stream_class->packet_context_field_type);
goto end;
}
- ret = bt_field_type_common_validate_single_clock_class(
+ ret = bt_field_type_validate_single_clock_class(
stream_class->event_header_field_type,
expected_clock_class);
if (ret) {
"stream-class-id=%" PRId64 ", "
"ft-addr=%p",
stream_class,
- bt_stream_class_common_get_name(stream_class),
+ bt_stream_class_get_name(stream_class),
stream_class->id,
stream_class->event_header_field_type);
goto end;
}
- ret = bt_field_type_common_validate_single_clock_class(
+ ret = bt_field_type_validate_single_clock_class(
stream_class->event_context_field_type,
expected_clock_class);
if (ret) {
"stream-class-id=%" PRId64 ", "
"ft-addr=%p",
stream_class,
- bt_stream_class_common_get_name(stream_class),
+ bt_stream_class_get_name(stream_class),
stream_class->id,
stream_class->event_context_field_type);
goto end;
}
for (i = 0; i < stream_class->event_classes->len; i++) {
- struct bt_event_class_common *event_class =
+ struct bt_event_class *event_class =
g_ptr_array_index(stream_class->event_classes, i);
BT_ASSERT(event_class);
- ret = bt_event_class_common_validate_single_clock_class(
+ ret = bt_event_class_validate_single_clock_class(
event_class, expected_clock_class);
if (ret) {
BT_LOGW("Stream class's event class contains a "
"stream-class-name=\"%s\", "
"stream-class-id=%" PRId64,
stream_class,
- bt_stream_class_common_get_name(stream_class),
+ bt_stream_class_get_name(stream_class),
stream_class->id);
goto end;
}