X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=lib%2Fgraph%2Fnotification%2Fevent.c;h=97186a4c8df132cc6743d5a7bc9d01b5f21b147c;hb=094ff7c009937bb23c056333baffe734308a6b06;hp=6a1903dc34998d959b0f8623466e4a26c7f861ab;hpb=d8a36e1465244032decac7121c4fcb3c888dbd91;p=babeltrace.git diff --git a/lib/graph/notification/event.c b/lib/graph/notification/event.c index 6a1903dc..97186a4c 100644 --- a/lib/graph/notification/event.c +++ b/lib/graph/notification/event.c @@ -24,6 +24,9 @@ * SOFTWARE. */ +#define BT_LOG_TAG "NOTIF-EVENT" +#include + #include #include #include @@ -31,7 +34,13 @@ #include #include #include +#include #include +#include +#include +#include +#include +#include static void bt_notification_event_destroy(struct bt_object *obj) @@ -39,13 +48,16 @@ void bt_notification_event_destroy(struct bt_object *obj) struct bt_notification_event *notification = (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("Putting clock class priority map."); BT_PUT(notification->cc_prio_map); g_free(notification); } -static -bool validate_clock_classes(struct bt_notification_event *notif) +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 @@ -53,135 +65,195 @@ bool validate_clock_classes(struct bt_notification_event *notif) * this clock class. Also make sure that those clock classes * are part of the trace to which the event belongs. */ - bool is_valid = true; + 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_ctf_event_class *event_class = NULL; - struct bt_ctf_stream_class *stream_class = NULL; - struct bt_ctf_trace *trace = NULL; - - event_class = bt_ctf_event_borrow_event_class(notif->event); - assert(event_class); - stream_class = bt_ctf_event_class_borrow_stream_class(event_class); - assert(stream_class); - trace = bt_ctf_stream_class_borrow_trace(stream_class); - assert(trace); - trace_cc_count = bt_ctf_trace_get_clock_class_count(trace); - assert(trace_cc_count >= 0); + 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); - assert(cc_prio_map_cc_count >= 0); + 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++) { - struct bt_ctf_clock_class *clock_class = - bt_clock_class_priority_map_get_clock_class( - notif->cc_prio_map, cc_prio_map_cc_i); - struct bt_ctf_clock_value *clock_value; - bool found_in_trace = false; + bt_bool found_in_trace = BT_FALSE; - assert(clock_class); - clock_value = bt_ctf_event_get_clock_value(notif->event, + 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) { - is_valid = false; + 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; } - bt_put(clock_value); - for (trace_cc_i = 0; trace_cc_i < trace_cc_count; trace_cc_i++) { - struct bt_ctf_clock_class *trace_clock_class = - bt_ctf_trace_get_clock_class(trace, trace_cc_i); + struct bt_clock_class *trace_clock_class = + bt_trace_get_clock_class_by_index(trace, + trace_cc_i); - assert(trace_clock_class); + BT_ASSERT(trace_clock_class); + bt_put(trace_clock_class); if (trace_clock_class == clock_class) { - found_in_trace = true; + found_in_trace = BT_TRUE; break; } } - bt_put(clock_class); - if (!found_in_trace) { - is_valid = false; + 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; } -struct bt_notification *bt_notification_event_create(struct bt_ctf_event *event, +BT_ASSERT_PRE_FUNC +static inline bool event_has_trace(struct bt_event *event) +{ + 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_clock_class_priority_map *cc_prio_map) { struct bt_notification_event *notification = NULL; + struct bt_event_class *event_class; - if (!event || !cc_prio_map) { - goto error; - } + BT_ASSERT_PRE_NON_NULL(event, "Event"); - if (!bt_ctf_event_borrow_packet(event)) { - goto error; + 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); + 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-name=\"%s\", event-class-id=%" PRId64 ", " + "cc-prio-map-addr=%p", + event, 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); notification = g_new0(struct bt_notification_event, 1); if (!notification) { + BT_LOGE_STR("Failed to allocate one event notification."); goto error; } - bt_notification_init(¬ification->parent, - BT_NOTIFICATION_TYPE_EVENT, - bt_notification_event_destroy); + + bt_notification_init(¬ification->parent, BT_NOTIFICATION_TYPE_EVENT, + bt_notification_event_destroy); notification->event = bt_get(event); notification->cc_prio_map = bt_get(cc_prio_map); - if (!validate_clock_classes(notification)) { - goto error; - } + 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, + bt_event_class_get_name(event_class), + bt_event_class_get_id(event_class), cc_prio_map, + notification); + goto end; - bt_ctf_event_freeze(notification->event); - return ¬ification->parent; error: - bt_put(notification); - return NULL; + BT_PUT(notification); + +end: + bt_put(cc_prio_map); + return ¬ification->parent; } -struct bt_ctf_event *bt_notification_event_get_event( +struct bt_event *bt_notification_event_borrow_event( struct bt_notification *notification) { - struct bt_ctf_event *event = NULL; struct bt_notification_event *event_notification; - if (bt_notification_get_type(notification) != - BT_NOTIFICATION_TYPE_EVENT) { - goto end; - } + 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); - event = bt_get(event_notification->event); -end: - return event; + return event_notification->event; } extern struct bt_clock_class_priority_map * -bt_notification_event_get_clock_class_priority_map( +bt_notification_event_borrow_clock_class_priority_map( struct bt_notification *notification) { - struct bt_clock_class_priority_map *cc_prio_map = NULL; struct bt_notification_event *event_notification; - if (bt_notification_get_type(notification) != - BT_NOTIFICATION_TYPE_EVENT) { - goto end; - } - + 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); - cc_prio_map = bt_get(event_notification->cc_prio_map); -end: - return cc_prio_map; + return event_notification->cc_prio_map; }