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 ==============================