On Thu, 14 Jan 2021 at 19:57, Alexandre Oliva <ol...@adacore.com> wrote: > > On Jan 14, 2021, Jonathan Wakely <jwak...@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 <ol...@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