From 484f870c87266913a26fd680b5b9bc887315ae0e Mon Sep 17 00:00:00 2001 From: Peter du Marchie van Voorthuysen Date: Tue, 17 Nov 2020 22:33:52 +0100 Subject: [PATCH] Make cas($target, &code) ~10% faster --- src/core.c/atomicops.pm6 | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/core.c/atomicops.pm6 b/src/core.c/atomicops.pm6 index 83974aed928..8f2912d2367 100644 --- a/src/core.c/atomicops.pm6 +++ b/src/core.c/atomicops.pm6 @@ -24,12 +24,15 @@ multi sub cas($target is rw, \expected, \value) { } multi sub cas($target is rw, &code) { my $current := nqp::atomicload($target); - loop { - my $updated := code($current); - my $seen := nqp::cas($target, $current, $updated); - return $updated if nqp::eqaddr($seen, $current); - $current := $seen; - } + nqp::until( + nqp::stmts( + (my $updated := code($current)), + (my $seen := nqp::cas($target, $current, $updated)), + nqp::eqaddr($seen, $current) + ), + $current := $seen + ); + $updated } #== Native integer atomics only available on MoarVM ==============================