#include <babeltrace/ref.h>
#include <babeltrace/compiler.h>
#include <babeltrace/align.h>
+#include <babeltrace/endian.h>
static
void bt_ctf_stream_class_destroy(struct bt_object *obj);
stream_class->name = g_string_new(name);
stream_class->event_classes = g_ptr_array_new_with_free_func(
- (GDestroyNotify) bt_put);
+ (GDestroyNotify) bt_object_release);
if (!stream_class->event_classes) {
goto error;
}
struct bt_ctf_trace *bt_ctf_stream_class_get_trace(
struct bt_ctf_stream_class *stream_class)
{
- struct bt_ctf_trace *trace = NULL;
-
- if (!stream_class) {
- goto end;
- }
-
- trace = stream_class->trace;
- if (trace) {
- bt_get(trace);
- }
-end:
- return trace;
+ return (struct bt_ctf_trace *) bt_object_get_parent(
+ stream_class);
}
const char *bt_ctf_stream_class_get_name(
{
int ret = 0;
int64_t event_id;
+ struct bt_ctf_trace *trace = NULL;
+ struct bt_ctf_stream_class *old_stream_class = NULL;
if (!stream_class || !event_class) {
ret = -1;
goto end;
}
+ old_stream_class = (struct bt_ctf_stream_class *) bt_object_get_parent(
+ event_class);
+ if (old_stream_class) {
+ /* Event class is already associated to a stream class. */
+ ret = -1;
+ goto end;
+ }
+
/*
* Resolve the event's sequence length and variant tags if the
* stream is already associated with a trace. Otherwise, this
* validation will be performed once the stream is registered
* to a trace.
*/
- if (stream_class->trace) {
+ trace = (struct bt_ctf_trace *) bt_object_get_parent(
+ stream_class);
+ if (trace) {
ret = bt_ctf_event_class_resolve_types(event_class,
- stream_class->trace, stream_class);
+ trace, stream_class);
if (ret) {
goto end;
}
}
}
- ret = bt_ctf_event_class_set_stream_class(event_class, stream_class);
- if (ret) {
- goto end;
- }
-
ret = bt_ctf_event_class_set_stream_id(event_class, stream_class->id);
if (ret) {
goto end;
}
- bt_get(event_class);
+ bt_object_set_parent(event_class, stream_class);
g_ptr_array_add(stream_class->event_classes, event_class);
bt_ctf_event_class_freeze(event_class);
stream_class->byte_order);
}
end:
+ BT_PUT(trace);
+ BT_PUT(old_stream_class);
return ret;
}
}
BT_HIDDEN
-int bt_ctf_stream_class_set_byte_order(struct bt_ctf_stream_class *stream_class,
- enum bt_ctf_byte_order byte_order)
+void bt_ctf_stream_class_set_byte_order(
+ struct bt_ctf_stream_class *stream_class, int byte_order)
{
- int i, ret = 0;
- int internal_byte_order;
-
- /* Note that "NATIVE" means the trace's endianness, not the host's. */
- if (!stream_class || byte_order <= BT_CTF_BYTE_ORDER_UNKNOWN ||
- byte_order > BT_CTF_BYTE_ORDER_NETWORK) {
- ret = -1;
- goto end;
- }
-
- switch (byte_order) {
- case BT_CTF_BYTE_ORDER_NETWORK:
- case BT_CTF_BYTE_ORDER_BIG_ENDIAN:
- internal_byte_order = BIG_ENDIAN;
- break;
- case BT_CTF_BYTE_ORDER_LITTLE_ENDIAN:
- internal_byte_order = LITTLE_ENDIAN;
- break;
- default:
- ret = -1;
- goto end;
- }
+ int i;
- stream_class->byte_order = internal_byte_order;
+ assert(stream_class);
+ assert(byte_order == LITTLE_ENDIAN || byte_order == BIG_ENDIAN);
+ stream_class->byte_order = byte_order;
/* Set native byte order to little or big endian */
bt_ctf_field_type_set_native_byte_order(
- stream_class->event_header_type, stream_class->byte_order);
+ stream_class->event_header_type, byte_order);
bt_ctf_field_type_set_native_byte_order(
- stream_class->packet_context_type, stream_class->byte_order);
+ stream_class->packet_context_type, byte_order);
bt_ctf_field_type_set_native_byte_order(
- stream_class->event_context_type, stream_class->byte_order);
+ stream_class->event_context_type, byte_order);
/* Set all events' native byte order */
for (i = 0; i < stream_class->event_classes->len; i++) {
- bt_ctf_event_class_set_native_byte_order(
- g_ptr_array_index(stream_class->event_classes, i),
- stream_class->byte_order);
- bt_ctf_event_class_freeze(
- g_ptr_array_index(stream_class->event_classes, i));
+ struct bt_ctf_event_class *event_class =
+ g_ptr_array_index(stream_class->event_classes, i);
+
+ bt_ctf_event_class_set_native_byte_order(event_class,
+ byte_order);
}
-end:
- return ret;
}
BT_HIDDEN
return ret;
}
-BT_HIDDEN
-int bt_ctf_stream_class_set_trace(struct bt_ctf_stream_class *stream_class,
- struct bt_ctf_trace *trace)
-{
- int ret = 0;
-
- if (!stream_class) {
- ret = -1;
- goto end;
- }
-
- if (stream_class->trace && trace) {
- /* Already attached to a trace */
- ret = -1;
- goto end;
- }
-
- stream_class->trace = trace;
-end:
- return ret;
-}
-
static
void bt_ctf_stream_class_destroy(struct bt_object *obj)
{
bt_put(stream_class->clock);
if (stream_class->event_classes) {
- size_t i;
-
- /* Unregister this stream class from the event classes */
- for (i = 0; i < stream_class->event_classes->len; i++) {
- struct bt_ctf_event_class *event_class =
- g_ptr_array_index(stream_class->event_classes,
- i);
-
- bt_ctf_event_class_set_stream_class(event_class, NULL);
- }
-
g_ptr_array_free(stream_class->event_classes, TRUE);
}