lib: add internal object pool API and use it; adapt plugins/tests
[babeltrace.git] / lib / ctf-ir / event-class.c
index 7780095bf95b2a1715ce2933b34355a1fbdd32a2..57402e3474133bc5e712af3bbcd5564adb952c5a 100644 (file)
 #include <babeltrace/lib-logging-internal.h>
 
 #include <babeltrace/assert-pre-internal.h>
+#include <babeltrace/ctf-ir/clock-value-internal.h>
 #include <babeltrace/ctf-ir/fields-internal.h>
 #include <babeltrace/ctf-ir/field-types-internal.h>
 #include <babeltrace/ctf-ir/event-class.h>
 #include <babeltrace/ctf-ir/event-class-internal.h>
+#include <babeltrace/ctf-ir/event-internal.h>
 #include <babeltrace/ctf-ir/stream-class.h>
 #include <babeltrace/ctf-ir/stream-class-internal.h>
 #include <babeltrace/ctf-ir/trace-internal.h>
@@ -116,11 +118,21 @@ error:
 static
 void bt_event_class_destroy(struct bt_object *obj)
 {
+       struct bt_event_class *event_class = (void *) obj;
+
        BT_LOGD("Destroying event class: addr=%p", obj);
        bt_event_class_common_finalize(obj);
+       bt_object_pool_finalize(&event_class->event_pool);
        g_free(obj);
 }
 
+static
+void free_event(struct bt_event *event,
+               struct bt_event_class *event_class)
+{
+       bt_event_destroy(event);
+}
+
 struct bt_event_class *bt_event_class_create(const char *name)
 {
        int ret;
@@ -147,6 +159,16 @@ struct bt_event_class *bt_event_class_create(const char *name)
                goto error;
        }
 
+       ret = bt_object_pool_initialize(&event_class->event_pool,
+               (bt_object_pool_new_object_func) bt_event_new,
+               (bt_object_pool_destroy_object_func) free_event,
+               event_class);
+       if (ret) {
+               BT_LOGE("Failed to initialize event pool: ret=%d",
+                       ret);
+               goto error;
+       }
+
        BT_LOGD("Created event class object: addr=%p, name=\"%s\"",
                event_class, bt_event_class_get_name(event_class));
        goto end;
@@ -198,17 +220,19 @@ int bt_event_class_set_emf_uri(struct bt_event_class *event_class,
                emf_uri);
 }
 
-struct bt_stream_class *bt_event_class_get_stream_class(
+struct bt_stream_class *bt_event_class_borrow_stream_class(
                struct bt_event_class *event_class)
 {
        BT_ASSERT_PRE_NON_NULL(event_class, "Event class");
-       return bt_get(bt_event_class_borrow_stream_class(event_class));
+       return BT_FROM_COMMON(
+               bt_event_class_common_borrow_stream_class(BT_TO_COMMON(
+                       event_class)));
 }
 
-struct bt_field_type *bt_event_class_get_payload_field_type(
+struct bt_field_type *bt_event_class_borrow_payload_field_type(
                struct bt_event_class *event_class)
 {
-       return BT_FROM_COMMON(bt_event_class_common_get_payload_field_type(
+       return BT_FROM_COMMON(bt_event_class_common_borrow_payload_field_type(
                BT_TO_COMMON(event_class)));
 }
 
@@ -219,10 +243,10 @@ int bt_event_class_set_payload_field_type(struct bt_event_class *event_class,
                BT_TO_COMMON(event_class), (void *) field_type);
 }
 
-struct bt_field_type *bt_event_class_get_context_field_type(
+struct bt_field_type *bt_event_class_borrow_context_field_type(
                struct bt_event_class *event_class)
 {
-       return BT_FROM_COMMON(bt_event_class_common_get_context_field_type(
+       return BT_FROM_COMMON(bt_event_class_common_borrow_context_field_type(
                BT_TO_COMMON(event_class)));
 }
 
@@ -301,3 +325,43 @@ int bt_event_class_common_validate_single_clock_class(
 end:
        return ret;
 }
+
+BT_HIDDEN
+int bt_event_class_update_event_pool_clock_values(
+               struct bt_event_class *event_class)
+{
+       int ret = 0;
+       uint64_t i;
+       struct bt_stream_class *stream_class =
+               bt_event_class_borrow_stream_class(event_class);
+
+       BT_ASSERT(stream_class->common.clock_class);
+
+       for (i = 0; i < event_class->event_pool.size; i++) {
+               struct bt_clock_value *cv;
+               struct bt_event *event =
+                       event_class->event_pool.objects->pdata[i];
+
+               BT_ASSERT(event);
+
+               cv = g_hash_table_lookup(event->clock_values,
+                       stream_class->common.clock_class);
+               if (cv) {
+                       continue;
+               }
+
+               cv = bt_clock_value_create(stream_class->common.clock_class);
+               if (!cv) {
+                       BT_LIB_LOGE("Cannot create clock value from clock class: "
+                               "%![cc-]+K", stream_class->common.clock_class);
+                       ret = -1;
+                       goto end;
+               }
+
+               g_hash_table_insert(event->clock_values,
+                       stream_class->common.clock_class, cv);
+       }
+
+end:
+       return ret;
+}
This page took 0.024956 seconds and 4 git commands to generate.