lib: add internal object pool API and use it; adapt plugins/tests
[babeltrace.git] / lib / graph / notification / event.c
index 97186a4c8df132cc6743d5a7bc9d01b5f21b147c..486a8b1018eb248780b3de2979ba75cc76f05ea2 100644 (file)
@@ -49,129 +49,33 @@ void bt_notification_event_destroy(struct bt_object *obj)
                        (struct bt_notification_event *) obj;
 
        BT_LOGD("Destroying event notification: addr=%p", notification);
-       BT_LOGD_STR("Putting event.");
-       BT_PUT(notification->event);
+       BT_LOGD_STR("Recycling event.");
+       bt_event_recycle(notification->event);
+       notification->event = NULL;
        BT_LOGD_STR("Putting clock class priority map.");
        BT_PUT(notification->cc_prio_map);
        g_free(notification);
 }
 
-BT_ASSERT_PRE_FUNC static inline
-bt_bool validate_clock_classes(struct bt_notification_event *notif)
-{
-       /*
-        * For each clock class found in the notification's clock class
-        * priority map, make sure the event has a clock value set for
-        * this clock class. Also make sure that those clock classes
-        * are part of the trace to which the event belongs.
-        */
-       bt_bool is_valid = BT_TRUE;
-
-       int trace_cc_count;
-       int cc_prio_map_cc_count;
-       size_t cc_prio_map_cc_i, trace_cc_i;
-       struct bt_clock_value *clock_value = NULL;
-       struct bt_clock_class *clock_class = NULL;
-       struct bt_event_class *event_class = NULL;
-       struct bt_stream_class *stream_class = NULL;
-       struct bt_trace *trace = NULL;
-
-       event_class = bt_event_borrow_class(notif->event);
-       BT_ASSERT(event_class);
-       stream_class = bt_event_class_borrow_stream_class(event_class);
-       BT_ASSERT(stream_class);
-       trace = bt_stream_class_borrow_trace(stream_class);
-       BT_ASSERT(trace);
-       trace_cc_count = bt_trace_get_clock_class_count(trace);
-       BT_ASSERT(trace_cc_count >= 0);
-       cc_prio_map_cc_count =
-               bt_clock_class_priority_map_get_clock_class_count(
-                       notif->cc_prio_map);
-       BT_ASSERT(cc_prio_map_cc_count >= 0);
-
-       for (cc_prio_map_cc_i = 0; cc_prio_map_cc_i < cc_prio_map_cc_count;
-                       cc_prio_map_cc_i++) {
-               bt_bool found_in_trace = BT_FALSE;
-
-               clock_class =
-                       bt_clock_class_priority_map_get_clock_class_by_index(
-                               notif->cc_prio_map, cc_prio_map_cc_i);
-               BT_ASSERT(clock_class);
-               clock_value = bt_event_get_clock_value(notif->event,
-                       clock_class);
-               if (!clock_value) {
-                       BT_ASSERT_PRE_MSG("Event has no clock value for a clock class which exists in the notification's clock class priority map: "
-                               "notif-addr=%p, event-addr=%p, "
-                               "event-class-addr=%p, event-class-name=\"%s\", "
-                               "event-class-id=%" PRId64 ", "
-                               "cc-prio-map-addr=%p, "
-                               "clock-class-addr=%p, clock-class-name=\"%s\"",
-                               notif, notif->event, event_class,
-                               bt_event_class_get_name(event_class),
-                               bt_event_class_get_id(event_class),
-                               notif->cc_prio_map, clock_class,
-                               bt_clock_class_get_name(clock_class));
-                       is_valid = BT_FALSE;
-                       goto end;
-               }
-
-               for (trace_cc_i = 0; trace_cc_i < trace_cc_count;
-                               trace_cc_i++) {
-                       struct bt_clock_class *trace_clock_class =
-                               bt_trace_get_clock_class_by_index(trace,
-                                       trace_cc_i);
-
-                       BT_ASSERT(trace_clock_class);
-                       bt_put(trace_clock_class);
-
-                       if (trace_clock_class == clock_class) {
-                               found_in_trace = BT_TRUE;
-                               break;
-                       }
-               }
-
-               if (!found_in_trace) {
-                       BT_ASSERT_PRE_MSG("A clock class found in the event notification's clock class priority map does not exist in the notification's event's trace: "
-                               "notif-addr=%p, trace-addr=%p, "
-                               "trace-name=\"%s\", cc-prio-map-addr=%p, "
-                               "clock-class-addr=%p, clock-class-name=\"%s\"",
-                               notif, trace, bt_trace_get_name(trace),
-                               notif->cc_prio_map, clock_class,
-                               bt_clock_class_get_name(clock_class));
-                       is_valid = BT_FALSE;
-                       goto end;
-               }
-
-               BT_PUT(clock_value);
-               BT_PUT(clock_class);
-       }
-
-end:
-       bt_put(clock_value);
-       bt_put(clock_class);
-       return is_valid;
-}
-
 BT_ASSERT_PRE_FUNC
-static inline bool event_has_trace(struct bt_event *event)
+static inline bool event_class_has_trace(struct bt_event_class *event_class)
 {
-       struct bt_event_class *event_class;
        struct bt_stream_class *stream_class;
 
-       event_class = bt_event_borrow_class(event);
-       BT_ASSERT(event_class);
        stream_class = bt_event_class_borrow_stream_class(event_class);
        BT_ASSERT(stream_class);
        return bt_stream_class_borrow_trace(stream_class) != NULL;
 }
 
-struct bt_notification *bt_notification_event_create(struct bt_event *event,
+struct bt_notification *bt_notification_event_create(
+               struct bt_event_class *event_class,
+               struct bt_packet *packet,
                struct bt_clock_class_priority_map *cc_prio_map)
 {
        struct bt_notification_event *notification = NULL;
-       struct bt_event_class *event_class;
 
-       BT_ASSERT_PRE_NON_NULL(event, "Event");
+       BT_ASSERT_PRE_NON_NULL(event_class, "Event class");
+       BT_ASSERT_PRE_NON_NULL(packet, "Packet");
 
        if (cc_prio_map) {
                /* Function's reference, released at the end */
@@ -185,20 +89,16 @@ struct bt_notification *bt_notification_event_create(struct bt_event *event,
        }
 
        BT_ASSERT(cc_prio_map);
-       event_class = bt_event_borrow_class(event);
-       BT_ASSERT(event_class);
        BT_LOGD("Creating event notification object: "
-               "event-addr=%p, event-class-addr=%p, "
+               "event-class-addr=%p, "
                "event-class-name=\"%s\", event-class-id=%" PRId64 ", "
                "cc-prio-map-addr=%p",
-               event, event_class,
+               event_class,
                bt_event_class_get_name(event_class),
                bt_event_class_get_id(event_class), cc_prio_map);
 
-       BT_ASSERT_PRE(bt_event_borrow_packet(event),
-               "Event has no packet: %!+e", event);
-       BT_ASSERT_PRE(event_has_trace(event),
-               "Event has no trace: %!+e", event);
+       BT_ASSERT_PRE(event_class_has_trace(event_class),
+               "Event class is not part of a trace: %!+E", event_class);
        notification = g_new0(struct bt_notification_event, 1);
        if (!notification) {
                BT_LOGE_STR("Failed to allocate one event notification.");
@@ -207,19 +107,21 @@ struct bt_notification *bt_notification_event_create(struct bt_event *event,
 
        bt_notification_init(&notification->parent, BT_NOTIFICATION_TYPE_EVENT,
                bt_notification_event_destroy);
-       notification->event = bt_get(event);
+       notification->event = bt_event_create(event_class, packet);
+       if (!notification->event) {
+               BT_LIB_LOGE("Cannot create event from event class: "
+                       "%![event-class-]+E", event_class);
+               goto error;
+       }
+
        notification->cc_prio_map = bt_get(cc_prio_map);
-       BT_ASSERT_PRE(validate_clock_classes(notification),
-               "Invalid clock classes: %![event-]+e", event);
-       BT_LOGD_STR("Freezing event notification's event.");
-       bt_event_freeze(notification->event);
        BT_LOGD_STR("Freezing event notification's clock class priority map.");
        bt_clock_class_priority_map_freeze(notification->cc_prio_map);
        BT_LOGD("Created event notification object: "
                "event-addr=%p, event-class-addr=%p, "
                "event-class-name=\"%s\", event-class-id=%" PRId64 ", "
                "cc-prio-map-addr=%p, notif-addr=%p",
-               event, event_class,
+               notification->event, event_class,
                bt_event_class_get_name(event_class),
                bt_event_class_get_id(event_class), cc_prio_map,
                notification);
This page took 0.03286 seconds and 4 git commands to generate.