X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=lib%2Fgraph%2Fnotification%2Fevent.c;h=486a8b1018eb248780b3de2979ba75cc76f05ea2;hp=97186a4c8df132cc6743d5a7bc9d01b5f21b147c;hb=312c056ae3d374b253fa0cfe5ed576c0b0e5e569;hpb=d1e4683534e67cc8643ad27536f64f6cc54bc5dc diff --git a/lib/graph/notification/event.c b/lib/graph/notification/event.c index 97186a4c..486a8b10 100644 --- a/lib/graph/notification/event.c +++ b/lib/graph/notification/event.c @@ -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(¬ification->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);