From fca049584ae1bcd9b0859924f982c6a0f6c7388f Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Mon, 30 Jan 2012 14:30:35 -0500 Subject: [PATCH] Print time range during which events have been dropped Signed-off-by: Mathieu Desnoyers --- formats/ctf-text/ctf-text.c | 28 +++++++++++++++++++++------- formats/ctf/ctf.c | 10 ++++------ include/babeltrace/ctf-ir/metadata.h | 5 +++++ 3 files changed, 30 insertions(+), 13 deletions(-) diff --git a/formats/ctf-text/ctf-text.c b/formats/ctf-text/ctf-text.c index e4d7682c..a7e7ef6f 100644 --- a/formats/ctf-text/ctf-text.c +++ b/formats/ctf-text/ctf-text.c @@ -158,15 +158,16 @@ void set_field_names_print(struct ctf_text_stream_pos *pos, enum field_item item } static -void ctf_text_print_timestamp(struct ctf_text_stream_pos *pos, - struct ctf_stream *stream) +void ctf_text_print_timestamp(FILE *fp, struct ctf_text_stream_pos *pos, + struct ctf_stream *stream, + uint64_t timestamp) { uint64_t ts_sec = 0, ts_nsec; struct ctf_trace *trace = stream->stream_class->trace; struct trace_collection *tc = trace->collection; struct ctf_clock *clock = tc->single_clock; - ts_nsec = stream->timestamp; + ts_nsec = timestamp; /* Add offsets */ if (!opt_clock_raw && clock) { @@ -210,15 +211,15 @@ void ctf_text_print_timestamp(struct ctf_text_stream_pos *pos, fprintf(stderr, "[warning] Unable to print ascii time.\n"); goto seconds; } - fprintf(pos->fp, "%s", timestr); + fprintf(fp, "%s", timestr); } /* Print time in HH:MM:SS.ns */ - fprintf(pos->fp, "%02d:%02d:%02d.%09" PRIu64, + fprintf(fp, "%02d:%02d:%02d.%09" PRIu64, tm.tm_hour, tm.tm_min, tm.tm_sec, ts_nsec); goto end; } seconds: - fprintf(pos->fp, "%3" PRIu64 ".%09" PRIu64, + fprintf(fp, "%3" PRIu64 ".%09" PRIu64, ts_sec, ts_nsec); end: @@ -256,13 +257,26 @@ int ctf_text_write_event(struct stream_pos *ppos, return -EINVAL; } + /* Print events discarded */ + if (stream->events_discarded) { + fflush(stdout); + fprintf(stderr, "[warning] Tracer discarded %d events between [", + stream->events_discarded); + ctf_text_print_timestamp(stderr, pos, stream, stream->prev_timestamp); + fprintf(stderr, "] and ["); + ctf_text_print_timestamp(stderr, pos, stream, stream->timestamp); + fprintf(stderr, "]. You should consider increasing the buffer size.\n"); + fflush(stderr); + stream->events_discarded = 0; + } + if (stream->has_timestamp) { set_field_names_print(pos, ITEM_HEADER); if (pos->print_names) fprintf(pos->fp, "timestamp = "); else fprintf(pos->fp, "["); - ctf_text_print_timestamp(pos, stream); + ctf_text_print_timestamp(pos->fp, pos, stream, stream->timestamp); if (!pos->print_names) fprintf(pos->fp, "]"); diff --git a/formats/ctf/ctf.c b/formats/ctf/ctf.c index d4004d85..c343f183 100644 --- a/formats/ctf/ctf.c +++ b/formats/ctf/ctf.c @@ -121,6 +121,7 @@ void ctf_update_timestamp(struct ctf_stream *stream, updateval = stream->timestamp; updateval &= ~((1ULL << integer_declaration->len) - 1); updateval += newval; + stream->prev_timestamp = stream->timestamp; stream->timestamp = updateval; } @@ -405,22 +406,19 @@ void ctf_move_pos_slow(struct ctf_stream_pos *pos, size_t offset, int whence) pos->cur_index - 1); events_discarded_diff -= index->events_discarded; } - if (events_discarded_diff != 0) { - fflush(stdout); - fprintf(stderr, "[warning] %d events discarded by tracer. You should try using larger buffers.\n", - events_discarded_diff); - fflush(stderr); - } + file_stream->parent.events_discarded = events_discarded_diff; if (pos->offset == EOF) return; /* The reader will expect us to skip padding */ assert(pos->offset + offset == pos->content_size); ++pos->cur_index; + file_stream->parent.prev_timestamp = file_stream->parent.timestamp; break; } case SEEK_SET: assert(offset == 0); /* only seek supported for now */ pos->cur_index = 0; + file_stream->parent.prev_timestamp = 0; break; default: assert(0); diff --git a/include/babeltrace/ctf-ir/metadata.h b/include/babeltrace/ctf-ir/metadata.h index 773ebd68..ce5f8b9e 100644 --- a/include/babeltrace/ctf-ir/metadata.h +++ b/include/babeltrace/ctf-ir/metadata.h @@ -36,6 +36,7 @@ struct ctf_event; struct ctf_stream { struct ctf_stream_class *stream_class; uint64_t timestamp; /* Current timestamp, in ns */ + uint64_t prev_timestamp; uint64_t event_id; /* Current event ID */ int has_timestamp; uint64_t stream_id; @@ -47,6 +48,10 @@ struct ctf_stream { GPtrArray *events_by_id; /* Array of struct ctf_stream_event pointers indexed by id */ struct definition_scope *parent_def_scope; /* for initialization */ int stream_definitions_created; + + /* Event discarded information */ + uint32_t events_discarded; + }; struct ctf_stream_event { -- 2.34.1