Optimize out-of-line string CONCATENATE, part 2.
[sbcl.git] / src / code / barrier.lisp
blobb82adb6c02dd5a845964395b674086549d89cd71
1 ;;;; Support for memory barriers required for multithreaded operation
3 ;;;; This software is part of the SBCL system. See the README file for
4 ;;;; more information.
5 ;;;;
6 ;;;; This software is derived from the CMU CL system, which was
7 ;;;; written at Carnegie Mellon University and released into the
8 ;;;; public domain. The software is in the public domain and is
9 ;;;; provided with absolutely no warranty. See the COPYING and CREDITS
10 ;;;; files for more information.
12 (in-package "SB!THREAD")
15 ;;;; Interpreter stubs for the various barrier functions
17 #!-memory-barrier-vops
18 (declaim (inline sb!vm:%compiler-barrier sb!vm:%memory-barrier
19 sb!vm:%read-barrier sb!vm:%write-barrier
20 sb!vm:%data-dependency-barrier))
21 (defun sb!vm:%compiler-barrier ()
22 #!+memory-barrier-vops (sb!vm:%compiler-barrier)
23 (values))
24 (defun sb!vm:%memory-barrier ()
25 #!+memory-barrier-vops (sb!vm:%memory-barrier)
26 (values))
27 (defun sb!vm:%read-barrier ()
28 #!+memory-barrier-vops (sb!vm:%read-barrier)
29 (values))
30 (defun sb!vm:%write-barrier ()
31 #!+memory-barrier-vops (sb!vm:%write-barrier)
32 (values))
33 (defun sb!vm:%data-dependency-barrier ()
34 #!+memory-barrier-vops (sb!vm:%data-dependency-barrier)
35 (values))
38 ;;;; The actual barrier macro and support
39 (defmacro barrier ((kind) &body forms)
40 #!+sb-doc
41 "Insert a barrier in the code stream, preventing some sort of
42 reordering.
44 KIND should be one of:
46 :COMPILER
47 Prevent the compiler from reordering memory access across the
48 barrier.
49 :MEMORY
50 Prevent the cpu from reordering any memory access across the
51 barrier.
52 :READ
53 Prevent the cpu from reordering any read access across the
54 barrier.
55 :WRITE
56 Prevent the cpu from reordering any write access across the
57 barrier.
58 :DATA-DEPENDENCY
59 Prevent the cpu from reordering dependent memory reads across the
60 barrier (requiring reads before the barrier to complete before any
61 reads after the barrier that depend on them). This is a weaker
62 form of the :READ barrier.
64 FORMS is an implicit PROGN, evaluated before the barrier. BARRIER
65 returns the values of the last form in FORMS.
67 The file \"memory-barriers.txt\" in the Linux kernel documentation is
68 highly recommended reading for anyone programming at this level."
69 `(multiple-value-prog1
70 (progn ,@forms)
71 (,(or (getf '(:compiler sb!vm:%compiler-barrier
72 :memory sb!vm:%memory-barrier
73 :read sb!vm:%read-barrier
74 :write sb!vm:%write-barrier
75 :data-dependency sb!vm:%data-dependency-barrier)
76 kind)
77 (error "Unknown barrier kind ~S" kind)))))