X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=plugins%2Futils%2Fcounter%2Fcounter.c;h=0c2cd3cf14565d6c6720cdde78ca386a54217df7;hb=601b0d3c9a6bf91274d0f01ccdec7fecfe3ed310;hp=9ef22372d617216e984f72b81a49f907f98cedf3;hpb=9d408fcae74602e3591f66623ceb85f482d948ed;p=babeltrace.git diff --git a/plugins/utils/counter/counter.c b/plugins/utils/counter/counter.c index 9ef22372..0c2cd3cf 100644 --- a/plugins/utils/counter/counter.c +++ b/plugins/utils/counter/counter.c @@ -24,7 +24,7 @@ #include #include #include -#include +#include #include #include @@ -48,28 +48,20 @@ uint64_t get_total_count(struct counter *counter) counter->count.packet_begin + counter->count.packet_end + counter->count.inactivity + - counter->count.discarded_events + - counter->count.discarded_packets + counter->count.other; } static -void print_count(struct counter *counter, uint64_t total) +void print_count(struct counter *counter) { + uint64_t total = get_total_count(counter); + PRINTF_COUNT("event", "events", event); PRINTF_COUNT("stream beginning", "stream beginnings", stream_begin); PRINTF_COUNT("stream end", "stream ends", stream_end); PRINTF_COUNT("packet beginning", "packet beginnings", packet_begin); PRINTF_COUNT("packet end", "packet ends", packet_end); PRINTF_COUNT("inactivity", "inactivities", inactivity); - PRINTF_COUNT("discarded events notification", - "discarded events notifications", discarded_events_notifs); - PRINTF_COUNT(" known discarded event", " known discarded events", - discarded_events); - PRINTF_COUNT("discarded packets notification", - "discarded packets notifications", discarded_packets_notifs); - PRINTF_COUNT(" known discarded packet", " known discarded packets", - discarded_packets); if (counter->count.other > 0) { PRINTF_COUNT(" other (unknown) notification", @@ -83,19 +75,18 @@ void print_count(struct counter *counter, uint64_t total) } static -void try_print_count(struct counter *counter) +void try_print_count(struct counter *counter, uint64_t notif_count) { - uint64_t total; - if (counter->step == 0) { /* No update */ return; } - total = get_total_count(counter); + counter->at += notif_count; - if (total % counter->step == 0) { - print_count(counter, total); + if (counter->at >= counter->step) { + counter->at = 0; + print_count(counter); putchar('\n'); } } @@ -106,13 +97,13 @@ void try_print_last(struct counter *counter) const uint64_t total = get_total_count(counter); if (total != counter->last_printed_total) { - print_count(counter, total); + print_count(counter); } } void destroy_private_counter_data(struct counter *counter) { - bt_put(counter->notif_iter); + bt_object_put_ref(counter->notif_iter); g_free(counter); } @@ -120,11 +111,11 @@ void counter_finalize(struct bt_private_component *component) { struct counter *counter; - assert(component); + BT_ASSERT(component); counter = bt_private_component_get_user_data(component); - assert(counter); + BT_ASSERT(counter); try_print_last(counter); - bt_put(counter->notif_iter); + bt_object_put_ref(counter->notif_iter); g_free(counter); } @@ -149,24 +140,21 @@ enum bt_component_status counter_init(struct bt_private_component *component, counter->last_printed_total = -1ULL; counter->step = 1000; - step = bt_value_map_get(params, "step"); - if (bt_value_is_integer(step)) { + step = bt_value_map_borrow_entry_value(params, "step"); + if (step && bt_value_is_integer(step)) { int64_t val; - int vret = bt_value_integer_get(step, &val); - - assert(vret == 0); + val = bt_value_integer_get(step); if (val >= 0) { counter->step = (uint64_t) val; } } - hide_zero = bt_value_map_get(params, "hide-zero"); - if (bt_value_is_bool(hide_zero)) { + hide_zero = bt_value_map_borrow_entry_value(params, "hide-zero"); + if (hide_zero && bt_value_is_bool(hide_zero)) { bt_bool val; - int vret = bt_value_bool_get(hide_zero, &val); - assert(vret == 0); + val = bt_value_bool_get(hide_zero); counter->hide_zero = (bool) val; } @@ -181,53 +169,48 @@ error: destroy_private_counter_data(counter); end: - bt_put(step); - bt_put(hide_zero); return ret; } -void counter_port_connected( +enum bt_component_status counter_port_connected( struct bt_private_component *component, struct bt_private_port *self_port, struct bt_port *other_port) { + enum bt_component_status status = BT_COMPONENT_STATUS_OK; struct counter *counter; struct bt_notification_iterator *iterator; struct bt_private_connection *connection; enum bt_connection_status conn_status; counter = bt_private_component_get_user_data(component); - assert(counter); + BT_ASSERT(counter); connection = bt_private_port_get_private_connection(self_port); - assert(connection); + BT_ASSERT(connection); conn_status = bt_private_connection_create_notification_iterator( - connection, NULL, &iterator); + connection, &iterator); if (conn_status != BT_CONNECTION_STATUS_OK) { - counter->error = true; + status = BT_COMPONENT_STATUS_ERROR; goto end; } - BT_MOVE(counter->notif_iter, iterator); + BT_OBJECT_MOVE_REF(counter->notif_iter, iterator); end: - bt_put(connection); + bt_object_put_ref(connection); + return status; } enum bt_component_status counter_consume(struct bt_private_component *component) { enum bt_component_status ret = BT_COMPONENT_STATUS_OK; - struct bt_notification *notif = NULL; struct counter *counter; enum bt_notification_iterator_status it_ret; - int64_t count; + uint64_t notif_count; + bt_notification_array notifs; counter = bt_private_component_get_user_data(component); - assert(counter); - - if (unlikely(counter->error)) { - ret = BT_COMPONENT_STATUS_ERROR; - goto end; - } + BT_ASSERT(counter); if (unlikely(!counter->notif_iter)) { try_print_last(counter); @@ -235,8 +218,9 @@ enum bt_component_status counter_consume(struct bt_private_component *component) goto end; } - /* Consume one notification */ - it_ret = bt_notification_iterator_next(counter->notif_iter); + /* Consume notifications */ + it_ret = bt_private_connection_notification_iterator_next( + counter->notif_iter, ¬ifs, ¬if_count); if (it_ret < 0) { ret = BT_COMPONENT_STATUS_ERROR; goto end; @@ -252,58 +236,44 @@ enum bt_component_status counter_consume(struct bt_private_component *component) goto end; case BT_NOTIFICATION_ITERATOR_STATUS_OK: { - struct bt_notification *notif = - bt_notification_iterator_get_notification(counter->notif_iter); - - assert(notif); - switch (bt_notification_get_type(notif)) { - case BT_NOTIFICATION_TYPE_EVENT: - counter->count.event++; - break; - case BT_NOTIFICATION_TYPE_INACTIVITY: - counter->count.inactivity++; - break; - case BT_NOTIFICATION_TYPE_STREAM_BEGIN: - counter->count.stream_begin++; - break; - case BT_NOTIFICATION_TYPE_STREAM_END: - counter->count.stream_end++; - break; - case BT_NOTIFICATION_TYPE_PACKET_BEGIN: - counter->count.packet_begin++; - break; - case BT_NOTIFICATION_TYPE_PACKET_END: - counter->count.packet_end++; - break; - case BT_NOTIFICATION_TYPE_DISCARDED_EVENTS: - counter->count.discarded_events_notifs++; - count = bt_notification_discarded_events_get_count( - notif); - if (count >= 0) { - counter->count.discarded_events += count; - } - break; - case BT_NOTIFICATION_TYPE_DISCARDED_PACKETS: - counter->count.discarded_packets_notifs++; - count = bt_notification_discarded_packets_get_count( - notif); - if (count >= 0) { - counter->count.discarded_packets += count; + uint64_t i; + + for (i = 0; i < notif_count; i++) { + struct bt_notification *notif = notifs[i]; + + BT_ASSERT(notif); + switch (bt_notification_get_type(notif)) { + case BT_NOTIFICATION_TYPE_EVENT: + counter->count.event++; + break; + case BT_NOTIFICATION_TYPE_INACTIVITY: + counter->count.inactivity++; + break; + case BT_NOTIFICATION_TYPE_STREAM_BEGIN: + counter->count.stream_begin++; + break; + case BT_NOTIFICATION_TYPE_STREAM_END: + counter->count.stream_end++; + break; + case BT_NOTIFICATION_TYPE_PACKET_BEGIN: + counter->count.packet_begin++; + break; + case BT_NOTIFICATION_TYPE_PACKET_END: + counter->count.packet_end++; + break; + default: + counter->count.other++; } - break; - default: - counter->count.other++; - } - bt_put(notif); + bt_object_put_ref(notif); + } } default: break; } - try_print_count(counter); + try_print_count(counter, notif_count); end: - bt_put(notif); return ret; }