#include <babeltrace/ctf-ir/stream-class-internal.h>
#include <babeltrace/ctf-ir/trace.h>
#include <babeltrace/ctf-ir/trace-internal.h>
+#include <babeltrace/ctf-ir/packet-internal.h>
#include <babeltrace/ref.h>
#include <babeltrace/compiler-internal.h>
#include <babeltrace/align-internal.h>
BT_HIDDEN
void bt_stream_common_finalize(struct bt_stream_common *stream)
{
- int i;
-
BT_LOGD("Finalizing common stream object: addr=%p, name=\"%s\"",
stream, bt_stream_common_get_name(stream));
- /* Call destroy listeners in reverse registration order */
- if (stream->destroy_listeners) {
- for (i = stream->destroy_listeners->len - 1; i >= 0; i--) {
- struct bt_stream_common_destroy_listener *listener =
- &g_array_index(stream->destroy_listeners,
- struct bt_stream_common_destroy_listener, i);
-
- BT_LOGD("Calling destroy listener: func=%p, data=%p, index=%d",
- listener->func, listener->data, i);
- listener->func(stream, listener->data);
- }
- }
-
if (stream->name) {
g_string_free(stream->name, TRUE);
}
-
- if (stream->destroy_listeners) {
- g_array_free(stream->destroy_listeners, TRUE);
- }
}
static
BT_LOGD("Destroying stream object: addr=%p, name=\"%s\"",
stream, bt_stream_get_name(stream));
+ bt_object_pool_finalize(&stream->packet_pool);
bt_stream_common_finalize((void *) obj);
g_free(stream);
}
int ret = 0;
struct bt_trace_common *trace = NULL;
- bt_object_init(stream, release_func);
+ bt_object_init_shared_with_parent(&stream->base, release_func);
if (!stream_class) {
BT_LOGW_STR("Invalid parameter: stream class is NULL.");
* Acquire reference to parent since stream will become publicly
* reachable; it needs its parent to remain valid.
*/
- bt_object_set_parent(stream, trace);
+ bt_object_set_parent(&stream->base, &trace->base);
stream->stream_class = stream_class;
stream->id = (int64_t) id;
- stream->destroy_listeners = g_array_new(FALSE, TRUE,
- sizeof(struct bt_stream_common_destroy_listener));
- if (!stream->destroy_listeners) {
- BT_LOGE_STR("Failed to allocate a GArray.");
- goto error;
- }
if (name) {
stream->name = g_string_new(name);
return ret;
}
+static
+void bt_stream_free_packet(struct bt_packet *packet, struct bt_stream *stream)
+{
+ bt_packet_destroy(packet);
+}
+
static
struct bt_stream *bt_stream_create_with_id_no_check(
struct bt_stream_class *stream_class,
goto error;
}
+ ret = bt_object_pool_initialize(&stream->packet_pool,
+ (bt_object_pool_new_object_func) bt_packet_new,
+ (bt_object_pool_destroy_object_func) bt_stream_free_packet,
+ stream);
+ if (ret) {
+ BT_LOGE("Failed to initialize packet pool: ret=%d", ret);
+ goto error;
+ }
+
g_ptr_array_add(trace->common.streams, stream);
BT_LOGD("Created stream object: addr=%p", stream);
goto end;
{
return bt_stream_common_get_id(BT_TO_COMMON(stream));
}
-
-BT_HIDDEN
-void bt_stream_common_add_destroy_listener(struct bt_stream_common *stream,
- bt_stream_common_destroy_listener_func func, void *data)
-{
- struct bt_stream_common_destroy_listener listener;
-
- BT_ASSERT(stream);
- BT_ASSERT(func);
- listener.func = func;
- listener.data = data;
- g_array_append_val(stream->destroy_listeners, listener);
- BT_LOGV("Added stream destroy listener: stream-addr=%p, "
- "stream-name=\"%s\", func=%p, data=%p",
- stream, bt_stream_common_get_name(stream), func, data);
-}
-
-BT_HIDDEN
-void bt_stream_common_remove_destroy_listener(struct bt_stream_common *stream,
- bt_stream_common_destroy_listener_func func, void *data)
-{
- size_t i;
-
- BT_ASSERT(stream);
- BT_ASSERT(func);
-
- for (i = 0; i < stream->destroy_listeners->len; i++) {
- struct bt_stream_common_destroy_listener *listener =
- &g_array_index(stream->destroy_listeners,
- struct bt_stream_common_destroy_listener, i);
-
- if (listener->func == func && listener->data == data) {
- g_array_remove_index(stream->destroy_listeners, i);
- i--;
- BT_LOGV("Removed stream destroy listener: stream-addr=%p, "
- "stream-name=\"%s\", func=%p, data=%p",
- stream, bt_stream_common_get_name(stream),
- func, data);
- }
- }
-}