X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=plugins%2Ftext%2Fprint.c;h=255dc63a4717140b6009271eec39aabf97d9bfcb;hb=8803be2a10b800e139cd3dffa854bd612b00b289;hp=53adab4c738d56bd43aa65a3f4cc7cc8da23c0f3;hpb=c3c30b08de95f06de6ad2f12001bede5da3f7674;p=babeltrace.git diff --git a/plugins/text/print.c b/plugins/text/print.c index 53adab4c..255dc63a 100644 --- a/plugins/text/print.c +++ b/plugins/text/print.c @@ -4,6 +4,7 @@ * Babeltrace CTF Text Output Plugin Event Printing * * Copyright 2016 Jérémie Galarneau + * Copyright 2016 Mathieu Desnoyers * * Author: Jérémie Galarneau * @@ -31,7 +32,7 @@ #include #include #include -#include +#include #include #include #include @@ -61,14 +62,14 @@ enum bt_component_status print_field(struct text_component *text, static void print_timestamp_cycles(struct text_component *text, - struct bt_ctf_clock *clock, + struct bt_ctf_clock_class *clock_class, struct bt_ctf_event *event) { int ret; struct bt_ctf_clock_value *clock_value; uint64_t cycles; - clock_value = bt_ctf_event_get_clock_value(event, clock); + clock_value = bt_ctf_event_get_clock_value(event, clock_class); if (!clock_value) { fputs("????????????????????", text->out); return; @@ -81,11 +82,16 @@ void print_timestamp_cycles(struct text_component *text, return; } fprintf(text->out, "%020" PRIu64, cycles); + + if (text->last_cycles_timestamp != -1ULL) { + text->delta_cycles = cycles - text->last_cycles_timestamp; + } + text->last_cycles_timestamp = cycles; } static void print_timestamp_wall(struct text_component *text, - struct bt_ctf_clock *clock, + struct bt_ctf_clock_class *clock_class, struct bt_ctf_event *event) { int ret; @@ -95,7 +101,7 @@ void print_timestamp_wall(struct text_component *text, uint64_t ts_sec_abs, ts_nsec_abs; bool is_negative; - clock_value = bt_ctf_event_get_clock_value(event, clock); + clock_value = bt_ctf_event_get_clock_value(event, clock_class); if (!clock_value) { fputs("??:??:??.?????????", text->out); return; @@ -108,6 +114,11 @@ void print_timestamp_wall(struct text_component *text, return; } + if (text->last_real_timestamp != -1ULL) { + text->delta_real_timestamp = ts_nsec - text->last_real_timestamp; + } + text->last_real_timestamp = ts_nsec; + ts_sec += ts_nsec / NSEC_PER_SEC; ts_nsec = ts_nsec % NSEC_PER_SEC; if (ts_sec >= 0 && ts_nsec >= 0) { @@ -136,7 +147,7 @@ void print_timestamp_wall(struct text_component *text, ts_nsec_abs = -ts_nsec; } - if (/*!opt_clock_seconds*/true) { + if (!text->options.clock_seconds) { struct tm tm; time_t time_s = (time_t) ts_sec_abs; @@ -145,7 +156,7 @@ void print_timestamp_wall(struct text_component *text, goto seconds; } - if (/*!opt_clock_gmt*/true) { + if (!text->options.clock_gmt) { struct tm *res; res = localtime_r(&time_s, &tm); @@ -162,7 +173,7 @@ void print_timestamp_wall(struct text_component *text, goto seconds; } } - if (/*opt_clock_date*/false) { + if (text->options.clock_date) { char timestr[26]; size_t res; @@ -196,10 +207,8 @@ enum bt_component_status print_event_timestamp(struct text_component *text, struct bt_ctf_stream *stream = NULL; struct bt_ctf_stream_class *stream_class = NULL; struct bt_ctf_trace *trace = NULL; - struct bt_ctf_clock *clock = NULL; + struct bt_ctf_clock_class *clock_class = NULL; FILE *out = text->out; - FILE *err = text->err; - uint64_t real_timestamp; stream = bt_ctf_event_get_stream(event); if (!stream) { @@ -207,28 +216,65 @@ enum bt_component_status print_event_timestamp(struct text_component *text, goto end; } - /* FIXME - error checking */ stream_class = bt_ctf_stream_get_class(stream); + if (!stream_class) { + ret = BT_COMPONENT_STATUS_ERROR; + goto end; + } trace = bt_ctf_stream_class_get_trace(stream_class); - clock = bt_ctf_trace_get_clock(trace, 0); + if (!trace) { + ret = BT_COMPONENT_STATUS_ERROR; + goto end; + } + clock_class = bt_ctf_trace_get_clock_class(trace, 0); + if (!clock_class) { + ret = BT_COMPONENT_STATUS_ERROR; + goto end; + } fputs(print_names ? "timestamp = " : "[", out); if (text->options.print_timestamp_cycles) { - print_timestamp_cycles(text, clock, event); + print_timestamp_cycles(text, clock_class, event); } else { - print_timestamp_wall(text, clock, event); + print_timestamp_wall(text, clock_class, event); } if (!print_names) fputs("] ", out); - *start_line = !print_names; - if (!text->options.print_delta_field) { - goto end; + if (text->options.print_delta_field) { + if (print_names) + fputs(", delta = ", text->out); + else + fputs("(", text->out); + if (text->options.print_timestamp_cycles) { + if (text->delta_cycles == -1ULL) { + fputs("+??????????\?\?) ", text->out); /* Not a trigraph. */ + } else { + fprintf(text->out, "+%012" PRIu64, text->delta_cycles); + } + } else { + if (text->delta_real_timestamp != -1ULL) { + uint64_t delta_sec, delta_nsec, delta; + + delta = text->delta_real_timestamp; + delta_sec = delta / NSEC_PER_SEC; + delta_nsec = delta % NSEC_PER_SEC; + fprintf(text->out, "+%" PRIu64 ".%09" PRIu64, + delta_sec, delta_nsec); + } else { + fputs("+?.?????????", text->out); + } + } + if (!print_names) { + fputs(") ", text->out); + } } + *start_line = !print_names; + end: bt_put(stream); - bt_put(clock); + bt_put(clock_class); bt_put(stream_class); bt_put(trace); return ret; @@ -433,16 +479,6 @@ enum bt_component_status print_event_header(struct text_component *text, bt_put(uri_str); } } - if (text->options.print_callsite_field) { - if (!text->start_line) { - fputs(", ", text->out); - } - text->start_line = false; - if (print_names) { - fputs("callsite = ", text->out); - } - /* TODO */ - } if (!text->start_line) { fputs(", ", text->out); } @@ -591,18 +627,75 @@ enum bt_component_status print_enum(struct text_component *text, { enum bt_component_status ret = BT_COMPONENT_STATUS_OK; struct bt_ctf_field *container_field = NULL; - const char *mapping_name; - + struct bt_ctf_field_type *enumeration_field_type = NULL; + struct bt_ctf_field_type *container_field_type = NULL; + struct bt_ctf_field_type_enumeration_mapping_iterator *iter = NULL; + int nr_mappings = 0; + int is_signed; + + enumeration_field_type = bt_ctf_field_get_type(field); + if (!enumeration_field_type) { + ret = BT_COMPONENT_STATUS_ERROR; + goto end; + } container_field = bt_ctf_field_enumeration_get_container(field); if (!container_field) { ret = BT_COMPONENT_STATUS_ERROR; goto end; } - mapping_name = bt_ctf_field_enumeration_get_mapping_name(field); - if (mapping_name) { - fprintf(text->out, "( \"%s\"", mapping_name); + container_field_type = bt_ctf_field_get_type(container_field); + if (!container_field_type) { + ret = BT_COMPONENT_STATUS_ERROR; + goto end; + } + is_signed = bt_ctf_field_type_integer_get_signed(container_field_type); + if (is_signed < 0) { + ret = BT_COMPONENT_STATUS_ERROR; + goto end; + } + if (is_signed) { + int64_t value; + + if (bt_ctf_field_signed_integer_get_value(container_field, + &value)) { + ret = BT_COMPONENT_STATUS_ERROR; + goto end; + } + iter = bt_ctf_field_type_enumeration_find_mappings_by_signed_value( + enumeration_field_type, value); } else { - fprintf(text->out, "( "); + uint64_t value; + + if (bt_ctf_field_unsigned_integer_get_value(container_field, + &value)) { + ret = BT_COMPONENT_STATUS_ERROR; + goto end; + } + iter = bt_ctf_field_type_enumeration_find_mappings_by_unsigned_value( + enumeration_field_type, value); + } + if (!iter) { + ret = BT_COMPONENT_STATUS_ERROR; + goto end; + } + fprintf(text->out, "( "); + for (;;) { + const char *mapping_name; + + if (bt_ctf_field_type_enumeration_mapping_iterator_get_signed( + iter, &mapping_name, NULL, NULL) < 0) { + ret = BT_COMPONENT_STATUS_ERROR; + goto end; + } + if (nr_mappings++) + fprintf(text->out, ", "); + fprintf(text->out, "\"%s\"", mapping_name); + if (bt_ctf_field_type_enumeration_mapping_iterator_next(iter) < 0) { + break; + } + } + if (!nr_mappings) { + fprintf(text->out, ""); } fprintf(text->out, " : container = "); ret = print_integer(text, container_field); @@ -611,7 +704,10 @@ enum bt_component_status print_enum(struct text_component *text, } fprintf(text->out, " )"); end: + bt_put(iter); + bt_put(container_field_type); bt_put(container_field); + bt_put(enumeration_field_type); return ret; } @@ -914,22 +1010,36 @@ enum bt_component_status print_variant(struct text_component *text, fprintf(text->out, "{ "); text->depth++; if (print_names) { + int iter_ret; struct bt_ctf_field *tag_field = NULL; const char *tag_choice; + struct bt_ctf_field_type_enumeration_mapping_iterator *iter; tag_field = bt_ctf_field_variant_get_tag(variant); if (!tag_field) { ret = BT_COMPONENT_STATUS_ERROR; goto end; } - tag_choice = bt_ctf_field_enumeration_get_mapping_name(tag_field); - if (!tag_choice) { + + iter = bt_ctf_field_enumeration_get_mappings(tag_field); + if (!iter) { + bt_put(tag_field); + ret = BT_COMPONENT_STATUS_ERROR; + goto end; + } + + iter_ret = + bt_ctf_field_type_enumeration_mapping_iterator_get_signed( + iter, &tag_choice, NULL, NULL); + if (iter_ret) { + bt_put(iter); bt_put(tag_field); ret = BT_COMPONENT_STATUS_ERROR; goto end; } fprintf(text->out, "%s = ", rem_(tag_choice)); bt_put(tag_field); + bt_put(iter); } ret = print_field(text, field, print_names); if (ret != BT_COMPONENT_STATUS_OK) { @@ -997,7 +1107,6 @@ enum bt_component_status print_stream_packet_context(struct text_component *text } main_field = bt_ctf_packet_get_context(packet); if (!main_field) { - ret = BT_COMPONENT_STATUS_ERROR; goto end; } if (!text->start_line) { @@ -1024,7 +1133,6 @@ enum bt_component_status print_event_header_raw(struct text_component *text, main_field = bt_ctf_event_get_header(event); if (!main_field) { - ret = BT_COMPONENT_STATUS_ERROR; goto end; } if (!text->start_line) { @@ -1050,7 +1158,6 @@ enum bt_component_status print_stream_event_context(struct text_component *text, main_field = bt_ctf_event_get_stream_event_context(event); if (!main_field) { - ret = BT_COMPONENT_STATUS_ERROR; goto end; } if (!text->start_line) { @@ -1076,7 +1183,6 @@ enum bt_component_status print_event_context(struct text_component *text, main_field = bt_ctf_event_get_event_context(event); if (!main_field) { - ret = BT_COMPONENT_STATUS_ERROR; goto end; } if (!text->start_line) { @@ -1102,7 +1208,6 @@ enum bt_component_status print_event_payload(struct text_component *text, main_field = bt_ctf_event_get_payload_field(event); if (!main_field) { - ret = BT_COMPONENT_STATUS_ERROR; goto end; } if (!text->start_line) {