On Thu, 5 May 2022 at 07:56, Alexandre Oliva via Libstdc++
<libstd...@gcc.gnu.org> wrote:
>
>
> The async call and future variable initialization may take a while to
> complete on uniprocessors, especially if the async call and other
> unrelated processes run before context switches back to the main
> thread.
>
> Taking steady_begin only then sometimes causes the 11*100ms in the
> slow clock, counted from before the async call, to not be enough for
> the measured wait to last 1s in the steady clock.  I've seen it fall
> short of 1s by as little as a third of a tenth of a second in some
> cases, but in one surprisingly extreme case the elapsed wait time got
> only up to 216.7ms.
>
> Initializing both timestamps next to each other, before the async
> call, appears to avoid the problem entirely.  I've renamed the
> variable moved out of the block so as to avoid name hiding in the
> subsequent block, that has another steady_begin variable.
>
> The second wait fails a lot less frequently, but the 2s limit has been
> exceeded, so I'm bumping up the max sleep to ~4s, and the tolerance to
> 3s.
>
>
> I wasn't sure about whether to leave the added outputs that I put in to
> confirm the failure modes.  Please let me know in case they're
> undersirable, and I'll take them out.
>
> Regstrapped on x86_64-linux-gnu, ppc64le-linux-gnu, and also tested on
> ppc- and ppc64-vx7r2.  Ok to install?

Hi Alex,

This one slipped through the cracks, sorry.

Leaving the outputs seems useful in this case. For timing-sensitive
tests like this it's useful to have the output for exactly how long it
took when there's a FAIL in the logs.

The patch is OK for trunk now (and should still apply cleanly).



>
>
> for  libstdc++-v3/ChangeLog
>
>         * testsuite/30_threads/async/async.cc (test04): Initialize
>         steady_start, renamed from steady_begin, next to slow_start.
>         Increase tolerance for final wait.
> ---
>  libstdc++-v3/testsuite/30_threads/async/async.cc |   17 ++++++++++++-----
>  1 file changed, 12 insertions(+), 5 deletions(-)
>
> diff --git a/libstdc++-v3/testsuite/30_threads/async/async.cc 
> b/libstdc++-v3/testsuite/30_threads/async/async.cc
> index 38943ff1a9a5e..a36e1aee8bdef 100644
> --- a/libstdc++-v3/testsuite/30_threads/async/async.cc
> +++ b/libstdc++-v3/testsuite/30_threads/async/async.cc
> @@ -20,6 +20,7 @@
>  // with this library; see the file COPYING3.  If not see
>  // <http://www.gnu.org/licenses/>.
>
> +#include <iostream>
>
>  #include <future>
>  #include <thread>
> @@ -133,6 +134,7 @@ void test04()
>  {
>    using namespace std::chrono;
>
> +  auto const steady_start = steady_clock::now();
>    auto const slow_start = slow_clock::now();
>    future<void> f1 = async(launch::async, []() {
>        std::this_thread::sleep_for(std::chrono::seconds(2));
> @@ -140,21 +142,26 @@ void test04()
>
>    // Wait for ~1s
>    {
> -    auto const steady_begin = steady_clock::now();
>      auto const status = f1.wait_until(slow_start + milliseconds(100));
>      VERIFY(status == std::future_status::timeout);
> -    auto const elapsed = steady_clock::now() - steady_begin;
> +    auto const elapsed = steady_clock::now() - steady_start;
> +    if (elapsed < seconds(1))
> +      std::cout << elapsed.count () << "ns < 1s" << std::endl;
>      VERIFY(elapsed >= seconds(1));
>      VERIFY(elapsed < seconds(2));
>    }
>
> -  // Wait for up to ~2s more
> +  // Wait for up to ~4s more, but since the async sleep completes, the
> +  // actual wait may be shorter than 1s.  Tolerate 3s because 2s
> +  // hasn't been enough in some extreme cases.
>    {
>      auto const steady_begin = steady_clock::now();
> -    auto const status = f1.wait_until(slow_start + milliseconds(300));
> +    auto const status = f1.wait_until(slow_start + milliseconds(500));
>      VERIFY(status == std::future_status::ready);
>      auto const elapsed = steady_clock::now() - steady_begin;
> -    VERIFY(elapsed < seconds(2));
> +    if (elapsed >= seconds(3))
> +      std::cout << elapsed.count () << "ns > 2s" << std::endl;
> +    VERIFY(elapsed < seconds(3));
>    }
>  }
>
>
>
> --
> Alexandre Oliva, happy hacker                https://FSFLA.org/blogs/lxo/
>    Free Software Activist                       GNU Toolchain Engineer
> Disinformation flourishes because many people care deeply about injustice
> but very few check the facts.  Ask me about <https://stallmansupport.org>
>

Reply via email to