diff mbox series

[v3,2/5] qtest: replace gettimeofday with GTimer

Message ID 20220307070401.171986-3-marcandre.lureau@redhat.com
State Handled Elsewhere
Headers show
Series Remove qemu_gettimeofday() | expand

Commit Message

Marc-André Lureau March 7, 2022, 7:03 a.m. UTC
From: Marc-André Lureau <marcandre.lureau@redhat.com>

glib provides a convenience helper to measure elapsed time. It isn't
subject to wall-clock time changes.

Note that this changes the initial OPENED time, which used to print the
current time.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
---
 softmmu/qtest.c | 39 ++++++++++-----------------------------
 1 file changed, 10 insertions(+), 29 deletions(-)

Comments

Thomas Huth March 7, 2022, 7:45 a.m. UTC | #1
On 07/03/2022 08.03, marcandre.lureau@redhat.com wrote:
> From: Marc-André Lureau <marcandre.lureau@redhat.com>
> 
> glib provides a convenience helper to measure elapsed time. It isn't
> subject to wall-clock time changes.
> 
> Note that this changes the initial OPENED time, which used to print the
> current time.
[...]
> @@ -846,21 +828,20 @@ static void qtest_event(void *opaque, QEMUChrEvent event)
>           for (i = 0; i < ARRAY_SIZE(irq_levels); i++) {
>               irq_levels[i] = 0;
>           }
> -        qemu_gettimeofday(&start_time);
> +
> +        g_clear_pointer(&timer, g_timer_destroy);
> +        timer = g_timer_new();
>           qtest_opened = true;
>           if (qtest_log_fp) {
> -            fprintf(qtest_log_fp, "[I " FMT_timeval "] OPENED\n",
> -                    (long) start_time.tv_sec, (long) start_time.tv_usec);
> +            fprintf(qtest_log_fp, "[I " FMT_timeval "] OPENED\n", g_timer_elapsed(timer, NULL));
>           }
>           break;

The new timestamp here is quite unuseful now, of course ... could you 
replace it with g_get_current_time()  instead?

  Thomas
Marc-André Lureau March 7, 2022, 8:05 a.m. UTC | #2
Hi

On Mon, Mar 7, 2022 at 11:46 AM Thomas Huth <thuth@redhat.com> wrote:

> On 07/03/2022 08.03, marcandre.lureau@redhat.com wrote:
> > From: Marc-André Lureau <marcandre.lureau@redhat.com>
> >
> > glib provides a convenience helper to measure elapsed time. It isn't
> > subject to wall-clock time changes.
> >
> > Note that this changes the initial OPENED time, which used to print the
> > current time.
> [...]
> > @@ -846,21 +828,20 @@ static void qtest_event(void *opaque, QEMUChrEvent
> event)
> >           for (i = 0; i < ARRAY_SIZE(irq_levels); i++) {
> >               irq_levels[i] = 0;
> >           }
> > -        qemu_gettimeofday(&start_time);
> > +
> > +        g_clear_pointer(&timer, g_timer_destroy);
> > +        timer = g_timer_new();
> >           qtest_opened = true;
> >           if (qtest_log_fp) {
> > -            fprintf(qtest_log_fp, "[I " FMT_timeval "] OPENED\n",
> > -                    (long) start_time.tv_sec, (long)
> start_time.tv_usec);
> > +            fprintf(qtest_log_fp, "[I " FMT_timeval "] OPENED\n",
> g_timer_elapsed(timer, NULL));
> >           }
> >           break;
>
> The new timestamp here is quite unuseful now, of course ... could you
> replace it with g_get_current_time()  instead?
>

Eventually, but I wonder why this (and only this) particular timestamp
should be the current time.
Thomas Huth March 7, 2022, 9:59 a.m. UTC | #3
On 07/03/2022 09.05, Marc-André Lureau wrote:
> Hi
> 
> On Mon, Mar 7, 2022 at 11:46 AM Thomas Huth <thuth@redhat.com 
> <mailto:thuth@redhat.com>> wrote:
> 
>     On 07/03/2022 08.03, marcandre.lureau@redhat.com
>     <mailto:marcandre.lureau@redhat.com> wrote:
>      > From: Marc-André Lureau <marcandre.lureau@redhat.com
>     <mailto:marcandre.lureau@redhat.com>>
>      >
>      > glib provides a convenience helper to measure elapsed time. It isn't
>      > subject to wall-clock time changes.
>      >
>      > Note that this changes the initial OPENED time, which used to print the
>      > current time.
>     [...]
>      > @@ -846,21 +828,20 @@ static void qtest_event(void *opaque,
>     QEMUChrEvent event)
>      >           for (i = 0; i < ARRAY_SIZE(irq_levels); i++) {
>      >               irq_levels[i] = 0;
>      >           }
>      > -        qemu_gettimeofday(&start_time);
>      > +
>      > +        g_clear_pointer(&timer, g_timer_destroy);
>      > +        timer = g_timer_new();
>      >           qtest_opened = true;
>      >           if (qtest_log_fp) {
>      > -            fprintf(qtest_log_fp, "[I " FMT_timeval "] OPENED\n",
>      > -                    (long) start_time.tv_sec, (long)
>     start_time.tv_usec);
>      > +            fprintf(qtest_log_fp, "[I " FMT_timeval "] OPENED\n",
>     g_timer_elapsed(timer, NULL));
>      >           }
>      >           break;
> 
>     The new timestamp here is quite unuseful now, of course ... could you
>     replace it with g_get_current_time()  instead?
> 
> 
> Eventually, but I wonder why this (and only this) particular timestamp 
> should be the current time.

I assume it was meant as a possibility to sync the times in this log with 
other things that are going on on the host system in parallel. If you only 
have the relative time stamps in the log here, you cannot compare the events 
to other logs anymore.
(having said that, I wonder why it doesn't simply always use the current 
wall time and uses the relative time instead, but maybe there is also a 
reason for that...)

  Thomas
diff mbox series

Patch

diff --git a/softmmu/qtest.c b/softmmu/qtest.c
index 8b7cb6aa8e46..b2bb7777d17d 100644
--- a/softmmu/qtest.c
+++ b/softmmu/qtest.c
@@ -58,12 +58,12 @@  static FILE *qtest_log_fp;
 static QTest *qtest;
 static GString *inbuf;
 static int irq_levels[MAX_IRQ];
-static qemu_timeval start_time;
+static GTimer *timer;
 static bool qtest_opened;
 static void (*qtest_server_send)(void*, const char*);
 static void *qtest_server_send_opaque;
 
-#define FMT_timeval "%ld.%06ld"
+#define FMT_timeval "%.06f"
 
 /**
  * DOC: QTest Protocol
@@ -264,28 +264,13 @@  static int hex2nib(char ch)
     }
 }
 
-static void qtest_get_time(qemu_timeval *tv)
-{
-    qemu_gettimeofday(tv);
-    tv->tv_sec -= start_time.tv_sec;
-    tv->tv_usec -= start_time.tv_usec;
-    if (tv->tv_usec < 0) {
-        tv->tv_usec += 1000000;
-        tv->tv_sec -= 1;
-    }
-}
-
 static void qtest_send_prefix(CharBackend *chr)
 {
-    qemu_timeval tv;
-
     if (!qtest_log_fp || !qtest_opened) {
         return;
     }
 
-    qtest_get_time(&tv);
-    fprintf(qtest_log_fp, "[S +" FMT_timeval "] ",
-            (long) tv.tv_sec, (long) tv.tv_usec);
+    fprintf(qtest_log_fp, "[S +" FMT_timeval "] ", g_timer_elapsed(timer, NULL));
 }
 
 static void GCC_FMT_ATTR(1, 2) qtest_log_send(const char *fmt, ...)
@@ -386,12 +371,9 @@  static void qtest_process_command(CharBackend *chr, gchar **words)
     command = words[0];
 
     if (qtest_log_fp) {
-        qemu_timeval tv;
         int i;
 
-        qtest_get_time(&tv);
-        fprintf(qtest_log_fp, "[R +" FMT_timeval "]",
-                (long) tv.tv_sec, (long) tv.tv_usec);
+        fprintf(qtest_log_fp, "[R +" FMT_timeval "]", g_timer_elapsed(timer, NULL));
         for (i = 0; words[i]; i++) {
             fprintf(qtest_log_fp, " %s", words[i]);
         }
@@ -846,21 +828,20 @@  static void qtest_event(void *opaque, QEMUChrEvent event)
         for (i = 0; i < ARRAY_SIZE(irq_levels); i++) {
             irq_levels[i] = 0;
         }
-        qemu_gettimeofday(&start_time);
+
+        g_clear_pointer(&timer, g_timer_destroy);
+        timer = g_timer_new();
         qtest_opened = true;
         if (qtest_log_fp) {
-            fprintf(qtest_log_fp, "[I " FMT_timeval "] OPENED\n",
-                    (long) start_time.tv_sec, (long) start_time.tv_usec);
+            fprintf(qtest_log_fp, "[I " FMT_timeval "] OPENED\n", g_timer_elapsed(timer, NULL));
         }
         break;
     case CHR_EVENT_CLOSED:
         qtest_opened = false;
         if (qtest_log_fp) {
-            qemu_timeval tv;
-            qtest_get_time(&tv);
-            fprintf(qtest_log_fp, "[I +" FMT_timeval "] CLOSED\n",
-                    (long) tv.tv_sec, (long) tv.tv_usec);
+            fprintf(qtest_log_fp, "[I +" FMT_timeval "] CLOSED\n", g_timer_elapsed(timer, NULL));
         }
+        g_clear_pointer(&timer, g_timer_destroy);
         break;
     default:
         break;