+
+static
+int print_discarded_elements_msg(struct pretty_component *pretty,
+ const bt_stream *stream,
+ const bt_clock_snapshot *begin_clock_snapshot,
+ const bt_clock_snapshot *end_clock_snapshot,
+ uint64_t count, const char *elem_type)
+{
+ int ret = 0;
+ const bt_stream_class *stream_class = NULL;
+ const bt_trace *trace = NULL;
+ const char *stream_name;
+ const char *trace_name;
+ bt_uuid trace_uuid;
+ int64_t stream_class_id;
+ int64_t stream_id;
+ const char *init_msg;
+
+ /* Stream name */
+ stream_name = bt_stream_get_name(stream);
+ if (!stream_name) {
+ stream_name = "(unknown)";
+ }
+
+ /* Stream class ID */
+ stream_class = bt_stream_borrow_class_const(stream);
+ BT_ASSERT(stream_class);
+ stream_class_id = bt_stream_class_get_id(stream_class);
+
+ /* Stream ID */
+ stream_id = bt_stream_get_id(stream);
+
+ /* Trace name */
+ trace = bt_stream_borrow_trace_const(stream);
+ BT_ASSERT(trace);
+ trace_name = bt_trace_get_name(trace);
+ if (!trace_name) {
+ trace_name = "(unknown)";
+ }
+
+ /* Trace UUID */
+ trace_uuid = bt_trace_class_get_uuid(
+ bt_trace_borrow_class_const(trace));
+
+ /* Format message */
+ g_string_assign(pretty->string, "");
+
+ if (count == UINT64_C(-1)) {
+ init_msg = "Tracer may have discarded";
+ } else {
+ init_msg = "Tracer discarded";
+ }
+
+ g_string_append_printf(pretty->string,
+ "%s%sWARNING%s%s: %s ",
+ bt_common_color_fg_yellow(),
+ bt_common_color_bold(),
+ bt_common_color_reset(),
+ bt_common_color_fg_yellow(), init_msg);
+
+ if (count == UINT64_C(-1)) {
+ g_string_append_printf(pretty->string, "%ss", elem_type);
+ } else {
+ g_string_append_printf(pretty->string,
+ "%" PRIu64 " %s%s", count, elem_type,
+ count == 1 ? "" : "s");
+ }
+
+ g_string_append_c(pretty->string, ' ');
+
+ if (begin_clock_snapshot && end_clock_snapshot) {
+ g_string_append(pretty->string, "between [");
+ print_timestamp_wall(pretty, begin_clock_snapshot, false);
+ g_string_append(pretty->string, "] and [");
+ print_timestamp_wall(pretty, end_clock_snapshot, false);
+ g_string_append(pretty->string, "]");
+ } else {
+ g_string_append(pretty->string, "(unknown time range)");
+ }
+
+ g_string_append_printf(pretty->string, " in trace \"%s\" ", trace_name);
+
+ if (trace_uuid) {
+ g_string_append_printf(pretty->string,
+ "(UUID: %02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x) ",
+ trace_uuid[0],
+ trace_uuid[1],
+ trace_uuid[2],
+ trace_uuid[3],
+ trace_uuid[4],
+ trace_uuid[5],
+ trace_uuid[6],
+ trace_uuid[7],
+ trace_uuid[8],
+ trace_uuid[9],
+ trace_uuid[10],
+ trace_uuid[11],
+ trace_uuid[12],
+ trace_uuid[13],
+ trace_uuid[14],
+ trace_uuid[15]);
+ } else {
+ g_string_append(pretty->string, "(no UUID) ");
+ }
+
+ g_string_append_printf(pretty->string,
+ "within stream \"%s\" (stream class ID: %" PRIu64 ", ",
+ stream_name, stream_class_id);
+
+ if (stream_id >= 0) {
+ g_string_append_printf(pretty->string,
+ "stream ID: %" PRIu64, stream_id);
+ } else {
+ g_string_append(pretty->string, "no stream ID");
+ }
+
+ g_string_append_printf(pretty->string, ").%s\n",
+ bt_common_color_reset());
+
+ /*
+ * Print to standard error stream to remain backward compatible
+ * with Babeltrace 1.
+ */
+ if (flush_buf(stderr, pretty)) {
+ ret = -1;
+ }
+
+ return ret;
+}
+
+BT_HIDDEN
+int pretty_print_discarded_items(struct pretty_component *pretty,
+ const bt_message *msg)
+{
+ const bt_clock_snapshot *begin = NULL;
+ const bt_clock_snapshot *end = NULL;
+ const bt_stream *stream;
+ const bt_stream_class *stream_class;
+ uint64_t count = UINT64_C(-1);
+ const char *elem_type;
+
+ switch (bt_message_get_type(msg)) {
+ case BT_MESSAGE_TYPE_DISCARDED_EVENTS:
+ stream = bt_message_discarded_events_borrow_stream_const(msg);
+
+ if (bt_message_discarded_events_get_count(msg, &count) ==
+ BT_PROPERTY_AVAILABILITY_NOT_AVAILABLE) {
+ count = UINT64_C(-1);
+ }
+
+ elem_type = "event";
+ break;
+ case BT_MESSAGE_TYPE_DISCARDED_PACKETS:
+ stream = bt_message_discarded_packets_borrow_stream_const(msg);
+
+ if (bt_message_discarded_packets_get_count(msg, &count) ==
+ BT_PROPERTY_AVAILABILITY_NOT_AVAILABLE) {
+ count = UINT64_C(-1);
+ }
+
+ elem_type = "packet";
+ break;
+ default:
+ abort();
+ }
+
+ BT_ASSERT(stream);
+ stream_class = bt_stream_borrow_class_const(stream);
+
+ switch (bt_message_get_type(msg)) {
+ case BT_MESSAGE_TYPE_DISCARDED_EVENTS:
+ if (bt_stream_class_discarded_events_have_default_clock_snapshots(
+ stream_class)) {
+ begin = bt_message_discarded_events_borrow_beginning_default_clock_snapshot_const(
+ msg);
+ end = bt_message_discarded_events_borrow_end_default_clock_snapshot_const(
+ msg);
+ }
+
+ break;
+ case BT_MESSAGE_TYPE_DISCARDED_PACKETS:
+ if (bt_stream_class_discarded_packets_have_default_clock_snapshots(
+ stream_class)) {
+ begin = bt_message_discarded_packets_borrow_beginning_default_clock_snapshot_const(
+ msg);
+ end = bt_message_discarded_packets_borrow_end_default_clock_snapshot_const(
+ msg);
+ }
+
+ break;
+ default:
+ abort();
+ }
+
+ print_discarded_elements_msg(pretty, stream, begin, end,
+ count, elem_type);
+ return 0;
+}