lib: add internal object pool API and use it; adapt plugins/tests
[babeltrace.git] / lib / ctf-ir / stream.c
index 828b2db8676cd11e32a499fe2935b0e455f30ff2..4eb05a8b6365019e05818c7e6652ce2d18d21af3 100644 (file)
@@ -36,6 +36,7 @@
 #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>
@@ -52,14 +53,16 @@ void bt_stream_common_finalize(struct bt_stream_common *stream)
                stream, bt_stream_common_get_name(stream));
 
        /* Call destroy listeners in reverse registration order */
-       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->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) {
@@ -78,6 +81,7 @@ void bt_stream_destroy(struct bt_object *obj)
 
        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);
 }
@@ -171,6 +175,12 @@ end:
        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,
@@ -224,6 +234,15 @@ struct bt_stream *bt_stream_create_with_id_no_check(
                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;
@@ -260,9 +279,9 @@ end:
        return stream;
 }
 
-struct bt_stream_class *bt_stream_get_class(struct bt_stream *stream)
+struct bt_stream_class *bt_stream_borrow_class(struct bt_stream *stream)
 {
-       return BT_FROM_COMMON(bt_stream_common_get_class(BT_TO_COMMON(stream)));
+       return BT_FROM_COMMON(bt_stream_common_borrow_class(BT_TO_COMMON(stream)));
 }
 
 const char *bt_stream_get_name(struct bt_stream *stream)
This page took 0.025506 seconds and 4 git commands to generate.