Il mar 10 giu 2025, 23:28 Pierrick Bouvier <pierrick.bouv...@linaro.org> ha
scritto:

> This factor is applied to time spent since we read clock for the first
> time. It impacts value returned by get_clock() and get_clock_realtime().
>

Sounds like a good idea, however it needs a couple changes:

1) different clocks have different starts, so the clock_start must be
stored per clock type

2) dilation must be applied to timers too.

As to the option, it's not immediately clear is <1 is a speed up or a slow
down. Maybe speed-factor=N is more clearly speeding up things if N>1?

+    g_assert(now >= clock_start);
>

The assertion is not needed, and can even fail in cases involving daylight
savings time; perhaps you can assert that the result is positive instead?

+    if (!clock_time_dilation) {
> +        return now;
> +    }
>

Just initialize it to 1?

+    return clock_start + (now - clock_start) * clock_time_dilation;
>

Please cast back to integer after multiplying. Adding back clock_start in
floating point format loses precision (doubles have only 53 bits of
precision; seconds use 32 of them if the base is 1970, and nanoseconds
don't have the 30 bits they need).

+}
> +
>  /*
>   * Low level clock functions
>   */
> @@ -811,11 +823,9 @@ static inline int64_t get_clock_realtime(void)
>      struct timeval tv;
>
>      gettimeofday(&tv, NULL);
> -    return tv.tv_sec * 1000000000LL + (tv.tv_usec * 1000);
> +    return dilate_time(tv.tv_sec * 1000000000LL + (tv.tv_usec * 1000));
>  }
>
> -extern int64_t clock_start;
> -
>  /* Warning: don't insert tracepoints into these functions, they are
>     also used by simpletrace backend and tracepoints would cause
>     an infinite recursion! */
> @@ -826,7 +836,7 @@ static inline int64_t get_clock(void)
>  {
>      LARGE_INTEGER ti;
>      QueryPerformanceCounter(&ti);
> -    return muldiv64(ti.QuadPart, NANOSECONDS_PER_SECOND, clock_freq);
> +    dilate_time(muldiv64(ti.QuadPart, NANOSECONDS_PER_SECOND,
> clock_freq));
>

Missing "return".

Paolo

 }
>
>  #else
> @@ -838,10 +848,10 @@ static inline int64_t get_clock(void)
>      if (use_rt_clock) {
>          struct timespec ts;
>          clock_gettime(CLOCK_MONOTONIC, &ts);
> -        return ts.tv_sec * 1000000000LL + ts.tv_nsec;
> +        return dilate_time(ts.tv_sec * 1000000000LL + ts.tv_nsec);
>      } else {
>          /* XXX: using gettimeofday leads to problems if the date
> -           changes, so it should be avoided. */
> +           changes, so it should be avoided. Time is already dilated. */
>          return get_clock_realtime();
>      }
>  }
> diff --git a/util/qemu-timer-common.c b/util/qemu-timer-common.c
> index cc1326f7264..d8895aaccad 100644
> --- a/util/qemu-timer-common.c
> +++ b/util/qemu-timer-common.c
> @@ -28,6 +28,7 @@
>  /* real time host monotonic timer */
>
>  int64_t clock_start;
> +double clock_time_dilation;
>
>  #ifdef _WIN32
>
> --
> 2.47.2
>
>

Reply via email to