guile-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] Add atomic-box-update! function to (ice-9 atomic)


From: Andrew Tropin
Subject: [PATCH] Add atomic-box-update! function to (ice-9 atomic)
Date: Mon, 19 Jun 2023 16:20:20 +0400

* module/ice-9/atomic.scm (atomic-box-update!): New variable.
---
I was implementing some concurrent code and started to use (ice-9
atomic), when found out that there is no procedure for updating the
value of the atom using another function.

IMHO, atomic-box-update! fits well FP paradigm (which is widely used
across guile-based projects) in general and this module in particular
and should be provided out of the box.  Made a draft implementation.
LMKWYT.

 module/ice-9/atomic.scm | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/module/ice-9/atomic.scm b/module/ice-9/atomic.scm
index 2a8af901d..6bfa2e8ee 100644
--- a/module/ice-9/atomic.scm
+++ b/module/ice-9/atomic.scm
@@ -25,7 +25,8 @@
             atomic-box-ref
             atomic-box-set!
             atomic-box-swap!
-            atomic-box-compare-and-swap!))
+            atomic-box-compare-and-swap!
+            atomic-box-update!))
 
 (eval-when (expand load eval)
   (load-extension (string-append "libguile-" (effective-version))
@@ -36,3 +37,14 @@
   (add-interesting-primitive! 'atomic-box-set!)
   (add-interesting-primitive! 'atomic-box-swap!)
   (add-interesting-primitive! 'atomic-box-compare-and-swap!))
+
+(define (atomic-box-update! box proc . proc-args)
+  "Atomically updates value of BOX to (APPLY PROC BOX-VALUE PROC-ARGS),
+returns new value.  PROC may be called multiple times, and thus PROC
+should be free of side effects."
+  (let loop ()
+    (let* ((old-value (atomic-box-ref box))
+           (new-value (apply proc old-value proc-args)))
+      (if (eq? old-value (atomic-box-compare-and-swap! box old-value 
new-value))
+          new-value
+          (loop)))))
-- 
2.40.1

Attachment: signature.asc
Description: PGP signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]