calibrate intervals to avoid zero in futures poll test

Christophe Lyon christophe.lyon@linaro.org
Mon Feb 8 09:59:51 GMT 2021


On Thu, 14 Jan 2021 at 19:57, Alexandre Oliva <oliva@adacore.com> wrote:
>
> On Jan 14, 2021, Jonathan Wakely <jwakely@redhat.com> wrote:
>
> >> +      /* Got for some 10 cycles, but we're already past that and still
>
> > I can't parse "Got for some 10 cycles". If that's just a typo
>
> Yeah, I meant "Go for ... but if ..." and managed to double-mangle it.
> Thanks for spotting it.  Here's the patch I'm installing, with the typos
> fixed.  Thanks!
>
>
> calibrate intervals to avoid zero in futures poll test
>
> From: Alexandre Oliva <oliva@adacore.com>
>
> We get occasional failures of 30_threads/future/members/poll.cc
> on some platforms whose high resolution clock doesn't have such a high
> resolution; wait_for_0 ends up as 0, and then some asserts fail as
> intervals measured as longer than zero are tested for less than
> several times zero.
>
> This patch adds some calibration in the iteration count to set a
> measurable base time interval with some additional margin.
>

Seeing such random errors when testing arm target under qemu
on shared servers. I noticed several such errors on gcc-testresults, too.

So I guess this is a ping for this patch, to clear this noise in the results?

Thanks,

Christophe


>
> for  libstdc++-v3/ChangeLog
>
>         * testsuite/30_threads/future/members/poll.cc: Calibrate
>         iteration count.
> ---
>  .../testsuite/30_threads/future/members/poll.cc    |   33 +++++++++++++++++++-
>  1 file changed, 32 insertions(+), 1 deletion(-)
>
> diff --git a/libstdc++-v3/testsuite/30_threads/future/members/poll.cc b/libstdc++-v3/testsuite/30_threads/future/members/poll.cc
> index 91f685b172d73..133dae15ac471 100644
> --- a/libstdc++-v3/testsuite/30_threads/future/members/poll.cc
> +++ b/libstdc++-v3/testsuite/30_threads/future/members/poll.cc
> @@ -25,7 +25,7 @@
>  #include <iostream>
>  #include <testsuite_hooks.h>
>
> -const int iterations = 200;
> +int iterations = 200;
>
>  using namespace std;
>
> @@ -45,10 +45,41 @@ int main()
>    promise<int> p;
>    future<int> f = p.get_future();
>
> + start_over:
>    auto start = chrono::high_resolution_clock::now();
>    for(int i = 0; i < iterations; i++)
>      f.wait_for(chrono::seconds(0));
>    auto stop = chrono::high_resolution_clock::now();
> +
> +  /* We've run too few iterations for the clock resolution.
> +     Attempt to calibrate it.  */
> +  if (start == stop)
> +    {
> +      /* Loop until the clock advances, so that start is right after a
> +        time increment.  */
> +      do
> +       start = chrono::high_resolution_clock::now();
> +      while (start == stop);
> +      int i = 0;
> +      /* Now until the clock advances again, so that stop is right
> +        after another time increment.  */
> +      do
> +       {
> +         f.wait_for(chrono::seconds(0));
> +         stop = chrono::high_resolution_clock::now();
> +         i++;
> +       }
> +      while (start == stop);
> +      /* Go for some 10 cycles, but if we're already past that and
> +        still get into the calibration loop, double the iteration
> +        count and try again.  */
> +      if (iterations < i * 10)
> +       iterations = i * 10;
> +      else
> +       iterations *= 2;
> +      goto start_over;
> +    }
> +
>    double wait_for_0 = print("wait_for(0s)", stop - start);
>
>    start = chrono::high_resolution_clock::now();
>
>
> --
> Alexandre Oliva, happy hacker  https://FSFLA.org/blogs/lxo/
>    Free Software Activist         GNU Toolchain Engineer
>         Vim, Vi, Voltei pro Emacs -- GNUlius Caesar


More information about the Libstdc++ mailing list