X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fgraph%2Fnotification%2Fevent.c;h=d8178eca6fea9e62a4c1f5813704513a7667aea3;hb=56e18c4ce186892c36d7f2cb5078087425e60134;hp=3ed1c4cd0f6b6d351619bbdcd2497755c72d4c8b;hpb=5c5632787fc9cafa602c89a28966bcfd01ec0204;p=babeltrace.git diff --git a/lib/graph/notification/event.c b/lib/graph/notification/event.c index 3ed1c4cd..d8178eca 100644 --- a/lib/graph/notification/event.c +++ b/lib/graph/notification/event.c @@ -28,15 +28,15 @@ #include #include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #include -#include -#include #include +#include #include #include #include @@ -54,7 +54,8 @@ static inline bool event_class_has_trace(struct bt_event_class *event_class) } BT_HIDDEN -struct bt_notification *bt_notification_event_new(struct bt_graph *graph) +struct bt_notification *bt_notification_event_new( + struct bt_graph *graph) { struct bt_notification_event *notification = NULL; @@ -76,70 +77,75 @@ end: } struct bt_notification *bt_notification_event_create( - struct bt_graph *graph, + struct bt_private_connection_private_notification_iterator *notif_iter, struct bt_event_class *event_class, - struct bt_packet *packet, - struct bt_clock_class_priority_map *cc_prio_map) + struct bt_packet *packet) { struct bt_notification_event *notification = NULL; + struct bt_event *event; + struct bt_graph *graph; + BT_ASSERT_PRE_NON_NULL(notif_iter, "Notification iterator"); 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 */ - bt_get(cc_prio_map); - } else { - cc_prio_map = bt_clock_class_priority_map_create(); - if (!cc_prio_map) { - BT_LOGE_STR("Cannot create empty clock class priority map."); - goto error; - } - } - - BT_ASSERT(cc_prio_map); BT_LOGD("Creating event notification object: " "event-class-addr=%p, " - "event-class-name=\"%s\", event-class-id=%" PRId64 ", " - "cc-prio-map-addr=%p", + "event-class-name=\"%s\", event-class-id=%" PRId64, event_class, bt_event_class_get_name(event_class), - bt_event_class_get_id(event_class), cc_prio_map); - + bt_event_class_get_id(event_class)); BT_ASSERT_PRE(event_class_has_trace(event_class), "Event class is not part of a trace: %!+E", event_class); - notification = (void *) bt_notification_create_from_pool( - &graph->event_notif_pool, graph); - if (!notification) { - /* bt_notification_create_from_pool() logs errors */ + event = bt_event_create(event_class, packet); + if (unlikely(!event)) { + BT_LIB_LOGE("Cannot create event from event class: " + "%![event-class-]+E", event_class); goto error; } - 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); + /* + * Create notification from pool _after_ we have everything + * (in this case, a valid event object) so that we never have an + * error condition with a non-NULL notification object. + * Otherwise: + * + * * We cannot recycle the notification on error because + * bt_notification_event_recycle() expects a complete + * notification (and the event or clock class priority map + * object could be unset). + * + * * We cannot destroy the notification because we would need + * to notify the graph (pool owner) so that it removes the + * notification from its notification array. + */ + graph = bt_private_connection_private_notification_iterator_borrow_graph( + notif_iter); + notification = (void *) bt_notification_create_from_pool( + &graph->event_notif_pool, graph); + if (unlikely(!notification)) { + /* bt_notification_create_from_pool() logs errors */ goto error; } - notification->cc_prio_map = bt_get(cc_prio_map); - BT_LOGD_STR("Freezing event notification's clock class priority map."); - bt_clock_class_priority_map_freeze(notification->cc_prio_map); + BT_ASSERT(!notification->event); + notification->event = event; + bt_packet_set_is_frozen(packet, true); + bt_event_class_freeze(event_class); 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", + "notif-addr=%p", notification->event, event_class, bt_event_class_get_name(event_class), - bt_event_class_get_id(event_class), cc_prio_map, + bt_event_class_get_id(event_class), notification); goto end; error: - BT_PUT(notification); + BT_ASSERT(!notification); + bt_event_destroy(event); end: - bt_put(cc_prio_map); return (void *) notification; } @@ -155,8 +161,6 @@ void bt_notification_event_destroy(struct bt_notification *notif) bt_event_recycle(event_notif->event); } - BT_LOGD_STR("Putting clock class priority map."); - BT_PUT(event_notif->cc_prio_map); g_free(notif); } @@ -168,21 +172,17 @@ void bt_notification_event_recycle(struct bt_notification *notif) BT_ASSERT(event_notif); - if (!notif->graph) { + if (unlikely(!notif->graph)) { bt_notification_event_destroy(notif); return; } BT_LOGD("Recycling event notification: addr=%p", notif); bt_notification_reset(notif); - - if (event_notif->event) { - BT_LOGD_STR("Recycling event."); - bt_event_recycle(event_notif->event); - event_notif->event = NULL; - } - - BT_PUT(event_notif->cc_prio_map); + BT_ASSERT(event_notif->event); + BT_LOGD_STR("Recycling event."); + bt_event_recycle(event_notif->event); + event_notif->event = NULL; graph = notif->graph; notif->graph = NULL; bt_object_pool_recycle_object(&graph->event_notif_pool, notif); @@ -199,16 +199,3 @@ struct bt_event *bt_notification_event_borrow_event( struct bt_notification_event, parent); return event_notification->event; } - -extern struct bt_clock_class_priority_map * -bt_notification_event_borrow_clock_class_priority_map( - struct bt_notification *notification) -{ - struct bt_notification_event *event_notification; - - BT_ASSERT_PRE_NON_NULL(notification, "Notification"); - BT_ASSERT_PRE_NOTIF_IS_TYPE(notification, BT_NOTIFICATION_TYPE_EVENT); - event_notification = container_of(notification, - struct bt_notification_event, parent); - return event_notification->cc_prio_map; -}