mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-30 11:50:28 +02:00
* doc/ref/vm.texi (Inlined Atomic Instructions): New section. * libguile/vm-engine.c (VM_VALIDATE_ATOMIC_BOX, make-atomic-box) (atomic-box-ref, atomic-box-set!, atomic-box-swap!) (atomic-box-compare-and-swap!): New instructions. * libguile/vm.c: Include atomic and atomics-internal.h. (vm_error_not_a_atomic_box): New function. * module/ice-9/atomic.scm: Register primitives with the compiler. * module/language/cps/compile-bytecode.scm (compile-function): Add support for atomic ops. * module/language/cps/effects-analysis.scm: Add comment about why no effects analysis needed. * module/language/cps/reify-primitives.scm (primitive-module): Add case for (ice-9 atomic). * module/language/tree-il/primitives.scm (*effect-free-primitives*): (*effect+exception-free-primitives*): Add atomic-box?. * module/system/vm/assembler.scm: Add new instructions. * test-suite/tests/atomic.test: Test with compilation and interpretation.
60 lines
2.2 KiB
Scheme
60 lines
2.2 KiB
Scheme
;;;; atomic.test --- test suite for Guile's atomic operations -*- scheme -*-
|
|
;;;;
|
|
;;;; Copyright (C) 2016 Free Software Foundation, Inc.
|
|
;;;;
|
|
;;;; This library is free software; you can redistribute it and/or
|
|
;;;; modify it under the terms of the GNU Lesser General Public
|
|
;;;; License as published by the Free Software Foundation; either
|
|
;;;; version 3 of the License, or (at your option) any later version.
|
|
;;;;
|
|
;;;; This library is distributed in the hope that it will be useful,
|
|
;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
;;;; Lesser General Public License for more details.
|
|
;;;;
|
|
;;;; You should have received a copy of the GNU Lesser General Public
|
|
;;;; License along with this library; if not, write to the Free Software
|
|
;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
(define-module (test-suite atomic)
|
|
#:use-module (ice-9 atomic)
|
|
#:use-module ((oop goops) #:select (class-of <atomic-box>))
|
|
#:use-module (test-suite lib))
|
|
|
|
(with-test-prefix/c&e "atomics"
|
|
(pass-if "predicate" (atomic-box? (make-atomic-box 42)))
|
|
|
|
(pass-if-equal "ref" 42 (atomic-box-ref (make-atomic-box 42)))
|
|
|
|
(pass-if-equal "swap" 42 (atomic-box-swap! (make-atomic-box 42) 10))
|
|
|
|
(pass-if-equal "set and ref" 10
|
|
(let ((box (make-atomic-box 42)))
|
|
(atomic-box-set! box 10)
|
|
(atomic-box-ref box)))
|
|
|
|
(pass-if-equal "swap and ref" 10
|
|
(let ((box (make-atomic-box 42)))
|
|
(atomic-box-swap! box 10)
|
|
(atomic-box-ref box)))
|
|
|
|
(pass-if-equal "compare and swap" 42
|
|
(let ((box (make-atomic-box 42)))
|
|
(atomic-box-compare-and-swap! box 42 10)))
|
|
|
|
(pass-if-equal "compare and swap (wrong)" 42
|
|
(let ((box (make-atomic-box 42)))
|
|
(atomic-box-compare-and-swap! box 43 10)))
|
|
|
|
(pass-if-equal "compare and swap and ref" 10
|
|
(let ((box (make-atomic-box 42)))
|
|
(atomic-box-compare-and-swap! box 42 10)
|
|
(atomic-box-ref box)))
|
|
|
|
(pass-if-equal "compare and swap (wrong) and ref" 42
|
|
(let ((box (make-atomic-box 42)))
|
|
(atomic-box-compare-and-swap! box 43 10)
|
|
(atomic-box-ref box)))
|
|
|
|
(pass-if-equal "class-of" <atomic-box>
|
|
(class-of (make-atomic-box 42))))
|