calibrate intervals to avoid zero in futures poll test
Jonathan Wakely
jwakely@redhat.com
Thu Jan 14 12:54:08 GMT 2021
On 05/01/21 04:44 -0300, Alexandre Oliva wrote:
>
>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.
>
>Regstrapped on x86_64-linux-gnu, and also tested on
>x-arm-wrs-vxworks7r2. Ok to install?
>
>
>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 fff9bea899c90..7b41411a54386 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);
>+ /* 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 that I'm
failing to spot ("good for"?) please fix and push the patch.
The patch is fine apart from me being unable to understand this
comment.
>+ 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