}
return ret;
}
+
+BT_HIDDEN
+int bt_ctf_event_set_stream(struct bt_ctf_event *event,
+ struct bt_ctf_stream *stream)
+{
+ int ret = 0;
+
+ if (!event) {
+ ret = -1;
+ goto end;
+ }
+
+ if (event->stream && stream) {
+ /* Already attached to a stream */
+ ret = -1;
+ goto end;
+ }
+
+ event->stream = stream;
+end:
+ return ret;
+}
return ret;
}
+static
+void put_event(struct bt_ctf_event *event)
+{
+ bt_ctf_event_set_stream(event, NULL);
+ bt_ctf_event_put(event);
+}
+
BT_HIDDEN
struct bt_ctf_stream *bt_ctf_stream_create(
struct bt_ctf_stream_class *stream_class,
stream->stream_class = stream_class;
bt_ctf_stream_class_get(stream_class);
stream->events = g_ptr_array_new_with_free_func(
- (GDestroyNotify) bt_ctf_event_put);
+ (GDestroyNotify) put_event);
if (!stream->events) {
goto error_destroy;
}
goto end;
}
+ ret = bt_ctf_event_set_stream(event, stream);
+ if (ret) {
+ /* Event was already associated to a stream */
+ ret = -1;
+ goto end;
+ }
+
ret = bt_ctf_event_populate_event_header(event);
if (ret) {
goto end;
g_ptr_array_add(stream->event_contexts, event_context_copy);
}
end:
+ if (ret) {
+ (void) bt_ctf_event_set_stream(event, NULL);
+ }
return ret;
}
#include <babeltrace/babeltrace-internal.h>
#include <babeltrace/objects.h>
#include <babeltrace/ctf/types.h>
+#include <babeltrace/ctf-ir/stream-class.h>
+#include <babeltrace/ctf-ir/stream.h>
#include <glib.h>
#define BT_CTF_EVENT_CLASS_ATTR_ID_INDEX 0
struct bt_ctf_event_class {
struct bt_ctf_ref ref_count;
struct bt_object *attributes;
- /* An event class does not have ownership of a stream class */
+ /*
+ * Weak reference; an event class does not have ownership of a
+ * stream class.
+ */
struct bt_ctf_stream_class *stream_class;
/* Structure type containing the event's context */
struct bt_ctf_field_type *context;
struct bt_ctf_event {
struct bt_ctf_ref ref_count;
struct bt_ctf_event_class *event_class;
+ /* Weak reference; an event does not have ownership of a stream */
+ struct bt_ctf_stream *stream;
struct bt_ctf_field *event_header;
struct bt_ctf_field *context_payload;
struct bt_ctf_field *fields_payload;
int bt_ctf_event_serialize(struct bt_ctf_event *event,
struct ctf_stream_pos *pos);
+BT_HIDDEN
+int bt_ctf_event_set_stream(struct bt_ctf_event *event,
+ struct bt_ctf_stream *stream);
+
/*
* Attempt to populate the "id" and "timestamp" fields of the event header if
* they are present, unset and their types are integers.