X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=lib%2Fgraph%2Fnotification%2Fevent.c;h=d205e66df95d323a1a10407638104ccd3e9064cf;hb=d4629a98ce942eb7bb40b2de558e532e61f450b1;hp=a9fbf48bd56a6c9c8183f3380e0d100db92fe05a;hpb=c5504f7322f93b32b4bcc65a950ed61efadd694a;p=babeltrace.git diff --git a/lib/graph/notification/event.c b/lib/graph/notification/event.c index a9fbf48b..d205e66d 100644 --- a/lib/graph/notification/event.c +++ b/lib/graph/notification/event.c @@ -24,14 +24,21 @@ * SOFTWARE. */ +#define BT_LOG_TAG "NOTIF-EVENT" +#include + #include #include #include -#include -#include +#include +#include #include #include +#include #include +#include +#include +#include static void bt_notification_event_destroy(struct bt_object *obj) @@ -39,90 +46,219 @@ 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_bool validate_clock_classes(struct bt_notification_event *notif) { /* - * For each clock class found in the event's trace, get the - * event's clock value for this clock class, and if it exists, - * make sure that this clock class has a priority in the - * notification's clock class priority map. + * 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. */ - bool is_valid = true; - int ret; - int count; - size_t i; + 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_clock_value *clock_value = NULL; + struct bt_ctf_clock_class *clock_class = NULL; struct bt_ctf_event_class *event_class = NULL; struct bt_ctf_stream_class *stream_class = NULL; struct bt_ctf_trace *trace = NULL; - uint64_t prio; - event_class = bt_ctf_event_get_class(notif->event); + event_class = bt_ctf_event_borrow_event_class(notif->event); assert(event_class); - stream_class = bt_ctf_event_class_get_stream_class(event_class); + stream_class = bt_ctf_event_class_borrow_stream_class(event_class); assert(stream_class); - trace = bt_ctf_stream_class_get_trace(stream_class); + trace = bt_ctf_stream_class_borrow_trace(stream_class); assert(trace); - count = bt_ctf_trace_get_clock_class_count(trace); - assert(count >= 0); + trace_cc_count = bt_ctf_trace_get_clock_class_count(trace); + 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); - for (i = 0; i < count; i++) { - struct bt_ctf_clock_class *clock_class = - bt_ctf_trace_get_clock_class(trace, i); + 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); assert(clock_class); - ret = bt_clock_class_priority_map_get_clock_class_priority( - notif->cc_prio_map, clock_class, &prio); - bt_put(clock_class); - if (ret) { - is_valid = false; + clock_value = bt_ctf_event_get_clock_value(notif->event, + clock_class); + if (!clock_value) { + BT_LOGW("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_ctf_event_class_get_name(event_class), + bt_ctf_event_class_get_id(event_class), + notif->cc_prio_map, clock_class, + bt_ctf_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_ctf_clock_class *trace_clock_class = + bt_ctf_trace_get_clock_class_by_index(trace, + trace_cc_i); + + 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_LOGW("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_ctf_trace_get_name(trace), + notif->cc_prio_map, clock_class, + bt_ctf_clock_class_get_name(clock_class)); + is_valid = BT_FALSE; + goto end; + } + + BT_PUT(clock_value); + BT_PUT(clock_class); } end: - bt_put(trace); - bt_put(stream_class); - bt_put(event_class); + bt_put(clock_value); + bt_put(clock_class); return is_valid; } +static +bool event_has_trace(struct bt_ctf_event *event) +{ + struct bt_ctf_event_class *event_class; + struct bt_ctf_stream_class *stream_class; + + event_class = bt_ctf_event_borrow_event_class(event); + assert(event_class); + stream_class = bt_ctf_event_class_borrow_stream_class(event_class); + assert(stream_class); + return bt_ctf_stream_class_borrow_trace(stream_class) != NULL; +} + struct bt_notification *bt_notification_event_create(struct bt_ctf_event *event, struct bt_clock_class_priority_map *cc_prio_map) { struct bt_notification_event *notification = NULL; + struct bt_ctf_event_class *event_class; - if (!event || !cc_prio_map) { + if (!event) { + BT_LOGW_STR("Invalid parameter: event is NULL."); 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; + } + } + + assert(cc_prio_map); + event_class = bt_ctf_event_borrow_event_class(event); + 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_ctf_event_class_get_name(event_class), + bt_ctf_event_class_get_id(event_class), cc_prio_map); + if (!bt_ctf_event_borrow_packet(event)) { + BT_LOGW("Invalid parameter: event has no packet: " + "event-addr=%p, event-class-addr=%p, " + "event-class-name=\"%s\", " + "event-class-id=%" PRId64, + event, event_class, + bt_ctf_event_class_get_name(event_class), + bt_ctf_event_class_get_id(event_class)); + goto error; + } + + if (!event_has_trace(event)) { + BT_LOGW("Invalid parameter: event has no trace: " + "event-addr=%p, event-class-addr=%p, " + "event-class-name=\"%s\", " + "event-class-id=%" PRId64, + event, event_class, + bt_ctf_event_class_get_name(event_class), + bt_ctf_event_class_get_id(event_class)); goto error; } 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)) { + BT_LOGW("Invalid event: invalid clock class: " + "event-addr=%p, event-class-addr=%p, " + "event-class-name=\"%s\", " + "event-class-id=%" PRId64, + event, event_class, + bt_ctf_event_class_get_name(event_class), + bt_ctf_event_class_get_id(event_class)); goto error; } + BT_LOGD_STR("Freezing event notification's event."); bt_ctf_event_freeze(notification->event); - return ¬ification->parent; + 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_ctf_event_class_get_name(event_class), + bt_ctf_event_class_get_id(event_class), cc_prio_map, + notification); + goto end; + 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( @@ -131,13 +267,24 @@ struct bt_ctf_event *bt_notification_event_get_event( struct bt_ctf_event *event = NULL; struct bt_notification_event *event_notification; + if (!notification) { + BT_LOGW_STR("Invalid parameter: notification is NULL."); + goto end; + } + if (bt_notification_get_type(notification) != BT_NOTIFICATION_TYPE_EVENT) { + BT_LOGW("Invalid parameter: notification is not an event notification: " + "addr%p, notif-type=%s", + notification, bt_notification_type_string( + bt_notification_get_type(notification))); goto end; } + event_notification = container_of(notification, struct bt_notification_event, parent); event = bt_get(event_notification->event); + end: return event; } @@ -149,14 +296,24 @@ bt_notification_event_get_clock_class_priority_map( struct bt_clock_class_priority_map *cc_prio_map = NULL; struct bt_notification_event *event_notification; + if (!notification) { + BT_LOGW_STR("Invalid parameter: notification is NULL."); + goto end; + } + if (bt_notification_get_type(notification) != BT_NOTIFICATION_TYPE_EVENT) { + BT_LOGW("Invalid parameter: notification is not an event notification: " + "addr%p, notif-type=%s", + notification, bt_notification_type_string( + bt_notification_get_type(notification))); goto end; } 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; }