Add new timestamped_file class
authorTom Tromey <tom@tromey.com>
Fri, 31 Dec 2021 18:44:19 +0000 (11:44 -0700)
committerTom Tromey <tom@tromey.com>
Mon, 28 Mar 2022 20:13:28 +0000 (14:13 -0600)
This adds a "timestamped_file" subclass of ui_file.  This class adds a
timestamp to its output when appropriate.  That is, it follows the
rule already used in vfprintf_unfiltered of adding a timestamp at most
once per write.

The new class is not yet used.

gdb/ui-file.c
gdb/ui-file.h
gdb/utils.c
gdb/utils.h

index d30ec04a68fc03f8811d4831e2770a5fd2ce3b3e..354a7c3e3b63a0e481b81d7841693633ade91ca5 100644 (file)
@@ -25,6 +25,7 @@
 #include "gdbsupport/gdb_select.h"
 #include "gdbsupport/filestuff.h"
 #include "cli/cli-style.h"
+#include <chrono>
 
 null_file null_stream;
 
@@ -449,3 +450,31 @@ no_terminal_escape_file::puts (const char *buf)
   if (*buf != '\0')
     this->stdio_file::write (buf, strlen (buf));
 }
+
+void
+timestamped_file::write (const char *buf, long len)
+{
+  if (debug_timestamp)
+    {
+      /* Print timestamp if previous print ended with a \n.  */
+      if (m_needs_timestamp)
+       {
+         using namespace std::chrono;
+
+         steady_clock::time_point now = steady_clock::now ();
+         seconds s = duration_cast<seconds> (now.time_since_epoch ());
+         microseconds us = duration_cast<microseconds> (now.time_since_epoch () - s);
+         std::string timestamp = string_printf ("%ld.%06ld ",
+                                                (long) s.count (),
+                                                (long) us.count ());
+         m_stream->puts (timestamp.c_str ());
+       }
+
+      /* Print the message.  */
+      m_stream->write (buf, len);
+
+      m_needs_timestamp = (len > 0 && buf[len - 1] == '\n');
+    }
+  else
+    m_stream->write (buf, len);
+}
index d8bc3fb3e24b3032203cb958a19e96ea1b4a3d99..8d41f6f8300cf6311fb7ad219eb3d2c248ea7c15 100644 (file)
@@ -364,4 +364,28 @@ public:
   void puts (const char *linebuffer) override;
 };
 
+/* A ui_file that optionally puts a timestamp at the start of each
+   line of output.  */
+
+class timestamped_file : public ui_file
+{
+public:
+  explicit timestamped_file (ui_file *stream)
+    : m_stream (stream)
+  {
+  }
+
+  DISABLE_COPY_AND_ASSIGN (timestamped_file);
+
+  void write (const char *buf, long len) override;
+
+private:
+
+  /* Output is sent here.  */
+  ui_file *m_stream;
+
+  /* True if the next output should be timestamped.  */
+  bool m_needs_timestamp = true;
+};
+
 #endif
index a8d6c96386da31d34b86994311403ea8ab15a4a9..8dd70087d0c4539aacb99091daa37001a68ce7a1 100644 (file)
@@ -103,7 +103,7 @@ static std::chrono::steady_clock::duration prompt_for_continue_wait_time;
 
 /* A flag indicating whether to timestamp debugging messages.  */
 
-static bool debug_timestamp = false;
+bool debug_timestamp = false;
 
 /* True means that strings with character values >0x7F should be printed
    as octal escapes.  False means just print the value (e.g. it's an
index d6080012aa697c4a24ea66d3b122d31e3b27c9aa..2cd0cff0766a23cbcf1d590cd301d7cbbe858318 100644 (file)
@@ -185,6 +185,9 @@ extern int get_chars_per_line ();
 
 extern bool pagination_enabled;
 
+/* A flag indicating whether to timestamp debugging messages.  */
+extern bool debug_timestamp;
+
 extern struct ui_file **current_ui_gdb_stdout_ptr (void);
 extern struct ui_file **current_ui_gdb_stdin_ptr (void);
 extern struct ui_file **current_ui_gdb_stderr_ptr (void);