mirror of
https://github.com/justinethier/cyclone.git
synced 2025-07-12 23:37:38 +02:00
Added compare-and-set!
This commit is contained in:
parent
5f517f6029
commit
ebb8a2d6cd
1 changed files with 24 additions and 7 deletions
|
@ -47,21 +47,38 @@
|
||||||
(define-c ref
|
(define-c ref
|
||||||
"(void *data, int argc, closure _, object k, object obj)"
|
"(void *data, int argc, closure _, object k, object obj)"
|
||||||
" atomic a;
|
" atomic a;
|
||||||
if (Cyc_is_atomic(obj) != boolean_t) {
|
Cyc_check_atomic(data, obj);
|
||||||
Cyc_rt_raise2(data, \"Type error: expected atom\", obj);
|
|
||||||
}
|
|
||||||
a = (atomic) obj;
|
a = (atomic) obj;
|
||||||
return_closcall1(data, k, ck_pr_load_ptr(&(a->obj)));")
|
return_closcall1(data, k, ck_pr_load_ptr(&(a->obj)));")
|
||||||
|
|
||||||
;; TODO:
|
;; TODO:
|
||||||
;; - swap, see https://clojure.github.io/clojure/clojure.core-api.html#clojure.core/swap!
|
;; - swap, see https://clojure.github.io/clojure/clojure.core-api.html#clojure.core/swap!
|
||||||
;; (swap! atom f)(swap! atom f x)(swap! atom f x y)(swap! atom f x y & args)
|
;; (swap! atom f)(swap! atom f x)(swap! atom f x y)(swap! atom f x y & args)
|
||||||
|
(define (swap! atom f . opts)
|
||||||
|
'TODO)
|
||||||
|
|
||||||
;; TODO:
|
;; (compare-and-set! atom oldval newval)
|
||||||
;; - compare and swap?
|
;; https://clojuredocs.org/clojure.core/compare-and-set!
|
||||||
|
;; Atomically sets the value of atom to newval if and only if the
|
||||||
|
;; current value of the atom is identical to oldval. Returns true if
|
||||||
|
;; set happened, else false
|
||||||
|
(define-c compare-and-set!
|
||||||
|
"(void *data, int argc, closure _, object k, object obj, object oldval, object newval)"
|
||||||
|
" atomic a;
|
||||||
|
Cyc_check_atomic(data, obj);
|
||||||
|
a = (atomic) obj;
|
||||||
|
bool result = ck_pr_cas_ptr(&(a->obj), oldval, newval);
|
||||||
|
object rv = result ? boolean_t : boolean_f;
|
||||||
|
return_closcall1(data, k, rv); ")
|
||||||
|
|
||||||
(define a (make-atom '(1 2)))
|
(define lis '(1 2))
|
||||||
|
(define a (make-atom lis))
|
||||||
(write
|
(write
|
||||||
(list
|
(list
|
||||||
a
|
a
|
||||||
(ref a)))
|
(ref a)
|
||||||
|
(compare-and-set! a 1 lis)
|
||||||
|
(ref a)
|
||||||
|
(compare-and-set! a lis 1)
|
||||||
|
(ref a)
|
||||||
|
))
|
||||||
|
|
Loading…
Add table
Reference in a new issue