#include <babeltrace/ctf-ir/stream.h>
#include <babeltrace/ctf-ir/stream-internal.h>
#include <babeltrace/ctf-ir/stream-class-internal.h>
+#include <babeltrace/ctf-ir/ref.h>
+#include <babeltrace/ctf-ir/common-internal.h>
#include <babeltrace/ctf-writer/functor-internal.h>
#include <babeltrace/compiler.h>
#include <babeltrace/align.h>
#include <babeltrace/ctf/ctf-index.h>
static
-void bt_ctf_stream_destroy(struct bt_ctf_ref *ref);
+void bt_ctf_stream_destroy(struct bt_ref *ref);
static
int set_structure_field_integer(struct bt_ctf_field *, char *, uint64_t);
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,
goto end;
}
+ /* A stream has no ownership of its trace (weak ptr) */
stream->trace = trace;
- bt_ctf_ref_init(&stream->ref_count);
+ bt_ctf_base_init(stream, bt_ctf_stream_destroy);
stream->packet_context = bt_ctf_field_create(
stream_class->packet_context_type);
if (!stream->packet_context) {
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;
}
/* A trace is not allowed to have a NULL packet header */
assert(trace->packet_header_type);
stream->packet_header = bt_ctf_field_create(trace->packet_header_type);
+ if (!stream->packet_header) {
+ goto error_destroy;
+ }
/*
* Attempt to populate the default trace packet header fields
* (magic, uuid and stream_id). This will _not_ fail shall the
end:
return stream;
error_destroy:
- bt_ctf_stream_destroy(&stream->ref_count);
+ bt_ctf_stream_destroy(&stream->base.ref_count);
return NULL;
}
return ret;
}
-BT_HIDDEN
-void bt_ctf_stream_set_trace(struct bt_ctf_stream *stream,
- struct bt_ctf_trace *trace)
-{
- stream->trace = trace;
-}
-
struct bt_ctf_stream_class *bt_ctf_stream_get_class(
struct bt_ctf_stream *stream)
{
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;
}
void bt_ctf_stream_get(struct bt_ctf_stream *stream)
{
- if (!stream) {
- return;
- }
-
- bt_ctf_ref_get(&stream->ref_count);
+ bt_ctf_get(stream);
}
void bt_ctf_stream_put(struct bt_ctf_stream *stream)
{
- if (!stream) {
- return;
- }
-
- bt_ctf_ref_put(&stream->ref_count, bt_ctf_stream_destroy);
+ bt_ctf_put(stream);
}
static
-void bt_ctf_stream_destroy(struct bt_ctf_ref *ref)
+void bt_ctf_stream_destroy(struct bt_ref *ref)
{
struct bt_ctf_stream *stream;
+ struct bt_ctf_base *base;
if (!ref) {
return;
}
- stream = container_of(ref, struct bt_ctf_stream, ref_count);
+ base = container_of(ref, struct bt_ctf_base, ref_count);
+ stream = container_of(base, struct bt_ctf_stream, base);
ctf_fini_pos(&stream->pos);
- if (close(stream->pos.fd)) {
+ if (stream->pos.fd >= 0 && close(stream->pos.fd)) {
perror("close");
}