Relocated (immutable?) procedure

This commit is contained in:
Justin Ethier 2019-06-18 13:30:22 -04:00
parent f3881ec059
commit 1b0c5f3e78
2 changed files with 34 additions and 33 deletions

View file

@ -23,6 +23,8 @@
deref deref
swap! swap!
compare-and-set! compare-and-set!
;; Immutable objects
immutable?
;; Shared objects ;; Shared objects
make-shared make-shared
share-all! share-all!
@ -95,23 +97,6 @@
(apply swap! atom f args) ;; Value changed, try again (apply swap! atom f args) ;; Value changed, try again
))) )))
;; Return a reference to an object that can be safely shared by many threads.
;;
;; If the given object is atomic or already shared it it simply returned.
;; Otherwise it is necessary to create a copy of the object.
;;
;; Note this function may trigger a minor GC if a thread-local pair or vector
;; is passed.
(define-c make-shared
"(void *data, int argc, closure _, object k, object obj)"
" Cyc_make_shared_object(data, k, obj); ")
;; Allow all objects currently on the calling thread's local stack to be shared
;; with other threads.
(define-c share-all!
"(void *data, int argc, closure _, object k)"
" Cyc_trigger_minor_gc(data, k); ")
;; (compare-and-set! atom oldval newval) ;; (compare-and-set! atom oldval newval)
;; https://clojuredocs.org/clojure.core/compare-and-set! ;; https://clojuredocs.org/clojure.core/compare-and-set!
;; Atomically sets the value of atom to newval if and only if the ;; Atomically sets the value of atom to newval if and only if the
@ -130,5 +115,37 @@
object rv = result ? boolean_t : boolean_f; object rv = result ? boolean_t : boolean_f;
return_closcall1(data, k, rv); ") return_closcall1(data, k, rv); ")
;; Return a reference to an object that can be safely shared by many threads.
;;
;; If the given object is atomic or already shared it it simply returned.
;; Otherwise it is necessary to create a copy of the object.
;;
;; Note this function may trigger a minor GC if a thread-local pair or vector
;; is passed.
(define-c make-shared
"(void *data, int argc, closure _, object k, object obj)"
" Cyc_make_shared_object(data, k, obj); ")
;; Allow all objects currently on the calling thread's local stack to be shared
;; with other threads.
(define-c share-all!
"(void *data, int argc, closure _, object k)"
" Cyc_trigger_minor_gc(data, k); ")
;; Predicate - is the given object immutable?
(define-c immutable?
"(void *data, int argc, closure _, object k, object obj)"
"object result = boolean_t;
if (is_object_type(obj) &&
(type_of(obj) == pair_tag ||
type_of(obj) == vector_tag ||
type_of(obj) == bytevector_tag ||
type_of(obj) == string_tag
) &&
!immutable(obj) ) {
result = boolean_f;
}
return_closcall1(data, k, result); ")
) )
) )

View file

@ -77,7 +77,6 @@
define-c-inline? define-c-inline?
define-c->inline-var define-c->inline-var
;; Immutable objects ;; Immutable objects
immutable?
Cyc-set-immutable! Cyc-set-immutable!
;; String functions ;; String functions
string-join string-join
@ -755,21 +754,6 @@
;; Immutable Object section ;; Immutable Object section
;; Predicate - is the given object immutable?
(define-c immutable?
"(void *data, int argc, closure _, object k, object obj)"
"object result = boolean_t;
if (is_object_type(obj) &&
(type_of(obj) == pair_tag ||
type_of(obj) == vector_tag ||
type_of(obj) == bytevector_tag ||
type_of(obj) == string_tag
) &&
!immutable(obj) ) {
result = boolean_f;
}
return_closcall1(data, k, result); ")
;; Internal helper function - set immutable field on a single obj ;; Internal helper function - set immutable field on a single obj
(define-c _Cyc-set-immutable! (define-c _Cyc-set-immutable!
"(void *data, int argc, closure _, object k, object obj, object val)" "(void *data, int argc, closure _, object k, object obj, object val)"