annotate d2/qtd/Atomic.d @ 382:1d56b2a2e10c

Fixes to debugging stuff. Added size_t as primitive type to workaround Qwt build failure in debug
author Max Samukha <maxter@spambox.com>
date Mon, 12 Jul 2010 20:36:07 +0300
parents 9784459f0750
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
291
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1 /**
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
2 * The atomic module is intended to provide some basic support for lock-free
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
3 * concurrent programming. Some common operations are defined, each of which
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
4 * may be performed using the specified memory barrier or a less granular
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
5 * barrier if the hardware does not support the version requested. This
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
6 * model is based on a design by Alexander Terekhov as outlined in
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
7 * <a href=http://groups.google.com/groups?threadm=3E4820EE.6F408B25%40web.de>
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
8 * this thread</a>. Another useful reference for memory ordering on modern
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
9 * architectures is <a href=http://www.linuxjournal.com/article/8211>this
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
10 * article by Paul McKenney</a>.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
11 *
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
12 * Copyright: Copyright (C) 2005-2006 Sean Kelly. All rights reserved.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
13 * License: BSD style: $(LICENSE)
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
14 * Authors: Sean Kelly
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
15 */
344
96a75b1e5b26 project structure changes
Max Samukha <maxter@spambox.com>
parents: 325
diff changeset
16 module qtd.Atomic;
291
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
17 //deprecated:
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
18 ////////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
19 // Synchronization Options
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
20 ////////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
21
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
22
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
23 /**
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
24 * Memory synchronization flag. If the supplied option is not available on the
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
25 * current platform then a stronger method will be used instead.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
26 */
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
27 enum msync
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
28 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
29 raw, /// not sequenced
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
30 hlb, /// hoist-load barrier
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
31 hsb, /// hoist-store barrier
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
32 slb, /// sink-load barrier
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
33 ssb, /// sink-store barrier
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
34 acq, /// hoist-load + hoist-store barrier
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
35 rel, /// sink-load + sink-store barrier
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
36 seq, /// fully sequenced (acq + rel)
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
37 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
38
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
39
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
40 ////////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
41 // Internal Type Checking
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
42 ////////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
43
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
44
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
45 private
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
46 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
47 version( D_Ddoc ) {} else
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
48 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
49 import std.traits;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
50
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
51
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
52 template isValidAtomicType( T )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
53 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
54 const bool isValidAtomicType = T.sizeof == byte.sizeof ||
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
55 T.sizeof == short.sizeof ||
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
56 T.sizeof == int.sizeof ||
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
57 T.sizeof == long.sizeof;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
58 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
59
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
60
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
61 template isValidNumericType( T )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
62 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
63 const bool isValidNumericType = isIntegral!( T ) ||
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
64 isPointer!( T );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
65 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
66
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
67
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
68 template isHoistOp( msync ms )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
69 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
70 const bool isHoistOp = ms == msync.hlb ||
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
71 ms == msync.hsb ||
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
72 ms == msync.acq ||
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
73 ms == msync.seq;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
74 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
75
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
76
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
77 template isSinkOp( msync ms )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
78 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
79 const bool isSinkOp = ms == msync.slb ||
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
80 ms == msync.ssb ||
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
81 ms == msync.rel ||
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
82 ms == msync.seq;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
83 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
84 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
85 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
86
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
87
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
88 ////////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
89 // DDoc Documentation for Atomic Functions
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
90 ////////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
91
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
92
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
93 version( D_Ddoc )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
94 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
95 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
96 // Atomic Load
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
97 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
98
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
99
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
100 /**
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
101 * Supported msync values:
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
102 * msync.raw
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
103 * msync.hlb
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
104 * msync.acq
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
105 * msync.seq
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
106 */
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
107 template atomicLoad( msync ms, T )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
108 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
109 /**
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
110 * Refreshes the contents of 'val' from main memory. This operation is
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
111 * both lock-free and atomic.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
112 *
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
113 * Params:
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
114 * val = The value to load. This value must be properly aligned.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
115 *
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
116 * Returns:
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
117 * The loaded value.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
118 */
325
b460cd08041f dmd 2.037 opEquals bug-feature
eldar1@eldar1-laptop
parents: 291
diff changeset
119 T atomicLoad( ref T val )
291
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
120 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
121 return val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
122 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
123 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
124
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
125
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
126 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
127 // Atomic Store
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
128 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
129
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
130
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
131 /**
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
132 * Supported msync values:
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
133 * msync.raw
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
134 * msync.ssb
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
135 * msync.acq
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
136 * msync.rel
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
137 * msync.seq
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
138 */
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
139 template atomicStore( msync ms, T )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
140 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
141 /**
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
142 * Stores 'newval' to the memory referenced by 'val'. This operation
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
143 * is both lock-free and atomic.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
144 *
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
145 * Params:
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
146 * val = The destination variable.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
147 * newval = The value to store.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
148 */
325
b460cd08041f dmd 2.037 opEquals bug-feature
eldar1@eldar1-laptop
parents: 291
diff changeset
149 void atomicStore( ref T val, T newval )
291
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
150 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
151
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
152 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
153 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
154
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
155
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
156 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
157 // Atomic StoreIf
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
158 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
159
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
160
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
161 /**
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
162 * Supported msync values:
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
163 * msync.raw
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
164 * msync.ssb
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
165 * msync.acq
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
166 * msync.rel
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
167 * msync.seq
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
168 */
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
169 template atomicStoreIf( msync ms, T )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
170 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
171 /**
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
172 * Stores 'newval' to the memory referenced by 'val' if val is equal to
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
173 * 'equalTo'. This operation is both lock-free and atomic.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
174 *
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
175 * Params:
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
176 * val = The destination variable.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
177 * newval = The value to store.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
178 * equalTo = The comparison value.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
179 *
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
180 * Returns:
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
181 * true if the store occurred, false if not.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
182 */
325
b460cd08041f dmd 2.037 opEquals bug-feature
eldar1@eldar1-laptop
parents: 291
diff changeset
183 bool atomicStoreIf( ref T val, T newval, T equalTo )
291
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
184 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
185 return false;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
186 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
187 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
188
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
189
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
190 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
191 // Atomic Increment
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
192 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
193
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
194
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
195 /**
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
196 * Supported msync values:
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
197 * msync.raw
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
198 * msync.ssb
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
199 * msync.acq
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
200 * msync.rel
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
201 * msync.seq
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
202 */
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
203 template atomicIncrement( msync ms, T )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
204 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
205 /**
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
206 * This operation is only legal for built-in value and pointer types,
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
207 * and is equivalent to an atomic "val = val + 1" operation. This
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
208 * function exists to facilitate use of the optimized increment
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
209 * instructions provided by some architecures. If no such instruction
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
210 * exists on the target platform then the behavior will perform the
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
211 * operation using more traditional means. This operation is both
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
212 * lock-free and atomic.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
213 *
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
214 * Params:
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
215 * val = The value to increment.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
216 *
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
217 * Returns:
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
218 * The result of an atomicLoad of val immediately following the
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
219 * increment operation. This value is not required to be equal to the
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
220 * newly stored value. Thus, competing writes are allowed to occur
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
221 * between the increment and successive load operation.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
222 */
325
b460cd08041f dmd 2.037 opEquals bug-feature
eldar1@eldar1-laptop
parents: 291
diff changeset
223 T atomicIncrement( ref T val )
291
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
224 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
225 return val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
226 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
227 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
228
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
229
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
230 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
231 // Atomic Decrement
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
232 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
233
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
234
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
235 /**
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
236 * Supported msync values:
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
237 * msync.raw
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
238 * msync.ssb
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
239 * msync.acq
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
240 * msync.rel
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
241 * msync.seq
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
242 */
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
243 template atomicDecrement( msync ms, T )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
244 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
245 /**
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
246 * This operation is only legal for built-in value and pointer types,
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
247 * and is equivalent to an atomic "val = val - 1" operation. This
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
248 * function exists to facilitate use of the optimized decrement
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
249 * instructions provided by some architecures. If no such instruction
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
250 * exists on the target platform then the behavior will perform the
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
251 * operation using more traditional means. This operation is both
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
252 * lock-free and atomic.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
253 *
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
254 * Params:
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
255 * val = The value to decrement.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
256 *
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
257 * Returns:
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
258 * The result of an atomicLoad of val immediately following the
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
259 * increment operation. This value is not required to be equal to the
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
260 * newly stored value. Thus, competing writes are allowed to occur
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
261 * between the increment and successive load operation.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
262 */
325
b460cd08041f dmd 2.037 opEquals bug-feature
eldar1@eldar1-laptop
parents: 291
diff changeset
263 T atomicDecrement( ref T val )
291
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
264 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
265 return val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
266 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
267 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
268 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
269
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
270
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
271 ////////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
272 // LDC Atomics Implementation
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
273 ////////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
274
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
275
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
276 else version( LDC )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
277 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
278 import ldc.intrinsics;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
279
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
280
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
281 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
282 // Atomic Load
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
283 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
284
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
285
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
286 template atomicLoad( msync ms = msync.seq, T )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
287 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
288 T atomicLoad(ref T val)
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
289 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
290 llvm_memory_barrier(
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
291 ms == msync.hlb || ms == msync.acq || ms == msync.seq,
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
292 ms == msync.hsb || ms == msync.acq || ms == msync.seq,
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
293 ms == msync.slb || ms == msync.rel || ms == msync.seq,
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
294 ms == msync.ssb || ms == msync.rel || ms == msync.seq,
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
295 false);
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
296 static if (isPointerType!(T))
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
297 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
298 return cast(T)llvm_atomic_load_add!(size_t)(cast(size_t*)&val, 0);
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
299 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
300 else static if (is(T == bool))
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
301 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
302 return llvm_atomic_load_add!(ubyte)(cast(ubyte*)&val, cast(ubyte)0) ? 1 : 0;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
303 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
304 else
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
305 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
306 return llvm_atomic_load_add!(T)(&val, cast(T)0);
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
307 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
308 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
309 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
310
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
311
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
312 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
313 // Atomic Store
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
314 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
315
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
316
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
317 template atomicStore( msync ms = msync.seq, T )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
318 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
319 void atomicStore( ref T val, T newval )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
320 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
321 llvm_memory_barrier(
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
322 ms == msync.hlb || ms == msync.acq || ms == msync.seq,
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
323 ms == msync.hsb || ms == msync.acq || ms == msync.seq,
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
324 ms == msync.slb || ms == msync.rel || ms == msync.seq,
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
325 ms == msync.ssb || ms == msync.rel || ms == msync.seq,
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
326 false);
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
327 static if (isPointerType!(T))
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
328 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
329 llvm_atomic_swap!(size_t)(cast(size_t*)&val, cast(size_t)newval);
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
330 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
331 else static if (is(T == bool))
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
332 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
333 llvm_atomic_swap!(ubyte)(cast(ubyte*)&val, newval?1:0);
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
334 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
335 else
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
336 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
337 llvm_atomic_swap!(T)(&val, newval);
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
338 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
339 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
340 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
341
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
342
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
343 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
344 // Atomic Store If
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
345 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
346
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
347
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
348 template atomicStoreIf( msync ms = msync.seq, T )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
349 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
350 bool atomicStoreIf( ref T val, T newval, T equalTo )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
351 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
352 llvm_memory_barrier(
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
353 ms == msync.hlb || ms == msync.acq || ms == msync.seq,
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
354 ms == msync.hsb || ms == msync.acq || ms == msync.seq,
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
355 ms == msync.slb || ms == msync.rel || ms == msync.seq,
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
356 ms == msync.ssb || ms == msync.rel || ms == msync.seq,
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
357 false);
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
358 T oldval = void;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
359 static if (isPointerType!(T))
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
360 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
361 oldval = cast(T)llvm_atomic_cmp_swap!(size_t)(cast(size_t*)&val, cast(size_t)equalTo, cast(size_t)newval);
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
362 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
363 else static if (is(T == bool))
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
364 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
365 oldval = llvm_atomic_cmp_swap!(ubyte)(cast(ubyte*)&val, equalTo?1:0, newval?1:0)?0:1;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
366 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
367 else
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
368 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
369 oldval = llvm_atomic_cmp_swap!(T)(&val, equalTo, newval);
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
370 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
371 return oldval == equalTo;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
372 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
373 }
357
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 344
diff changeset
374
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 344
diff changeset
375
291
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
376 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
377 // Atomic Increment
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
378 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
379
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
380
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
381 template atomicIncrement( msync ms = msync.seq, T )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
382 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
383 //
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
384 // NOTE: This operation is only valid for integer or pointer types
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
385 //
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
386 static assert( isValidNumericType!(T) );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
387
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
388
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
389 T atomicIncrement( ref T val )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
390 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
391 static if (isPointerType!(T))
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
392 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
393 llvm_atomic_load_add!(size_t)(cast(size_t*)&val, 1);
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
394 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
395 else
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
396 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
397 llvm_atomic_load_add!(T)(&val, cast(T)1);
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
398 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
399 return val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
400 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
401 }
357
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 344
diff changeset
402
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 344
diff changeset
403
291
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
404 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
405 // Atomic Decrement
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
406 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
407
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
408
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
409 template atomicDecrement( msync ms = msync.seq, T )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
410 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
411 //
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
412 // NOTE: This operation is only valid for integer or pointer types
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
413 //
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
414 static assert( isValidNumericType!(T) );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
415
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
416
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
417 T atomicDecrement( ref T val )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
418 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
419 static if (isPointerType!(T))
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
420 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
421 llvm_atomic_load_sub!(size_t)(cast(size_t*)&val, 1);
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
422 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
423 else
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
424 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
425 llvm_atomic_load_sub!(T)(&val, cast(T)1);
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
426 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
427 return val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
428 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
429 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
430 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
431
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
432 ////////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
433 // x86 Atomic Function Implementation
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
434 ////////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
435
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
436
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
437 else version( D_InlineAsm_X86 )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
438 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
439 version( X86 )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
440 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
441 version( BuildInfo )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
442 {
357
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 344
diff changeset
443 pragma( msg, "qtd.Atomic: using IA-32 inline asm" );
291
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
444 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
445
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
446 version(darwin){
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
447 extern(C) bool OSAtomicCompareAndSwap64(long oldValue, long newValue, long *theValue);
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
448 extern(C) bool OSAtomicCompareAndSwap64Barrier(long oldValue, long newValue, long *theValue);
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
449 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
450 version = Has64BitCAS;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
451 version = Has32BitOps;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
452 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
453 version( X86_64 )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
454 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
455 version( BuildInfo )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
456 {
357
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 344
diff changeset
457 pragma( msg, "qtd.core.Atomic: using AMD64 inline asm" );
291
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
458 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
459
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
460 version = Has64BitOps;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
461 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
462
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
463 private
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
464 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
465 ////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
466 // x86 Value Requirements
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
467 ////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
468
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
469
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
470 // NOTE: Strictly speaking, the x86 supports atomic operations on
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
471 // unaligned values. However, this is far slower than the
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
472 // common case, so such behavior should be prohibited.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
473 template atomicValueIsProperlyAligned( T )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
474 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
475 bool atomicValueIsProperlyAligned( size_t addr )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
476 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
477 return addr % T.sizeof == 0;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
478 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
479 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
480
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
481
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
482 ////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
483 // x86 Synchronization Requirements
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
484 ////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
485
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
486
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
487 // NOTE: While x86 loads have acquire semantics for stores, it appears
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
488 // that independent loads may be reordered by some processors
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
489 // (notably the AMD64). This implies that the hoist-load barrier
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
490 // op requires an ordering instruction, which also extends this
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
491 // requirement to acquire ops (though hoist-store should not need
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
492 // one if support is added for this later). However, since no
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
493 // modern architectures will reorder dependent loads to occur
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
494 // before the load they depend on (except the Alpha), raw loads
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
495 // are actually a possible means of ordering specific sequences
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
496 // of loads in some instances. The original atomic<>
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
497 // implementation provides a 'ddhlb' ordering specifier for
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
498 // data-dependent loads to handle this situation, but as there
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
499 // are no plans to support the Alpha there is no reason to add
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
500 // that option here.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
501 //
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
502 // For reference, the old behavior (acquire semantics for loads)
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
503 // required a memory barrier if: ms == msync.seq || isSinkOp!(ms)
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
504 template needsLoadBarrier( msync ms )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
505 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
506 const bool needsLoadBarrier = ms != msync.raw;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
507 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
508
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
509
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
510 // NOTE: x86 stores implicitly have release semantics so a membar is only
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
511 // necessary on acquires.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
512 template needsStoreBarrier( msync ms )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
513 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
514 const bool needsStoreBarrier = ms == msync.seq || isHoistOp!(ms);
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
515 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
516 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
517
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
518
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
519 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
520 // Atomic Load
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
521 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
522
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
523
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
524 template atomicLoad( msync ms = msync.seq, T )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
525 {
325
b460cd08041f dmd 2.037 opEquals bug-feature
eldar1@eldar1-laptop
parents: 291
diff changeset
526 T atomicLoad( ref T val )
291
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
527 in
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
528 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
529 assert( atomicValueIsProperlyAligned!(T)( cast(size_t) &val ) );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
530 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
531 body
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
532 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
533 static if( T.sizeof == byte.sizeof )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
534 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
535 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
536 // 1 Byte Load
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
537 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
538
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
539
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
540 static if( needsLoadBarrier!(ms) )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
541 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
542 asm
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
543 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
544 mov DL, 42;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
545 mov AL, 42;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
546 mov ECX, val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
547 lock;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
548 cmpxchg [ECX], DL;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
549 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
550 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
551 else
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
552 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
553 synchronized
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
554 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
555 return val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
556 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
557 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
558 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
559 else static if( T.sizeof == short.sizeof )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
560 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
561 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
562 // 2 Byte Load
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
563 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
564
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
565 static if( needsLoadBarrier!(ms) )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
566 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
567 asm
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
568 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
569 mov DX, 42;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
570 mov AX, 42;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
571 mov ECX, val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
572 lock;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
573 cmpxchg [ECX], DX;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
574 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
575 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
576 else
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
577 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
578 synchronized
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
579 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
580 return val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
581 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
582 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
583 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
584 else static if( T.sizeof == int.sizeof )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
585 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
586 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
587 // 4 Byte Load
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
588 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
589
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
590
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
591 static if( needsLoadBarrier!(ms) )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
592 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
593 asm
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
594 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
595 mov EDX, 42;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
596 mov EAX, 42;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
597 mov ECX, val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
598 lock;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
599 cmpxchg [ECX], EDX;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
600 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
601 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
602 else
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
603 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
604 synchronized
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
605 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
606 return val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
607 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
608 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
609 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
610 else static if( T.sizeof == long.sizeof )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
611 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
612 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
613 // 8 Byte Load
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
614 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
615
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
616
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
617 version( Has64BitOps )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
618 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
619 ////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
620 // 8 Byte Load on 64-Bit Processor
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
621 ////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
622
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
623
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
624 static if( needsLoadBarrier!(ms) )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
625 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
626 asm
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
627 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
628 mov RAX, val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
629 lock;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
630 mov RAX, [RAX];
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
631 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
632 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
633 else
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
634 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
635 synchronized
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
636 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
637 return val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
638 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
639 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
640 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
641 else
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
642 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
643 ////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
644 // 8 Byte Load on 32-Bit Processor
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
645 ////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
646
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
647
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
648 pragma( msg, "This operation is only available on 64-bit platforms." );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
649 static assert( false );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
650 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
651 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
652 else
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
653 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
654 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
655 // Not a 1, 2, 4, or 8 Byte Type
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
656 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
657
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
658
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
659 pragma( msg, "Invalid template type specified." );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
660 static assert( false );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
661 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
662 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
663 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
664
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
665
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
666 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
667 // Atomic Store
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
668 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
669
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
670
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
671 template atomicStore( msync ms = msync.seq, T )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
672 {
325
b460cd08041f dmd 2.037 opEquals bug-feature
eldar1@eldar1-laptop
parents: 291
diff changeset
673 void atomicStore( ref T val, T newval )
291
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
674 in
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
675 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
676 assert( atomicValueIsProperlyAligned!(T)( cast(size_t) &val ) );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
677 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
678 body
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
679 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
680 static if( T.sizeof == byte.sizeof )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
681 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
682 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
683 // 1 Byte Store
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
684 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
685
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
686
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
687 static if( needsStoreBarrier!(ms) )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
688 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
689 asm
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
690 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
691 mov EAX, val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
692 mov DL, newval;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
693 lock;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
694 xchg [EAX], DL;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
695 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
696 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
697 else
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
698 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
699 asm
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
700 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
701 mov EAX, val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
702 mov DL, newval;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
703 mov [EAX], DL;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
704 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
705 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
706 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
707 else static if( T.sizeof == short.sizeof )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
708 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
709 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
710 // 2 Byte Store
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
711 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
712
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
713
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
714 static if( needsStoreBarrier!(ms) )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
715 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
716 asm
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
717 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
718 mov EAX, val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
719 mov DX, newval;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
720 lock;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
721 xchg [EAX], DX;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
722 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
723 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
724 else
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
725 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
726 asm
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
727 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
728 mov EAX, val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
729 mov DX, newval;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
730 mov [EAX], DX;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
731 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
732 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
733 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
734 else static if( T.sizeof == int.sizeof )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
735 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
736 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
737 // 4 Byte Store
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
738 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
739
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
740
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
741 static if( needsStoreBarrier!(ms) )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
742 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
743 asm
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
744 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
745 mov EAX, val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
746 mov EDX, newval;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
747 lock;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
748 xchg [EAX], EDX;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
749 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
750 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
751 else
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
752 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
753 asm
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
754 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
755 mov EAX, val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
756 mov EDX, newval;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
757 mov [EAX], EDX;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
758 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
759 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
760 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
761 else static if( T.sizeof == long.sizeof )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
762 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
763 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
764 // 8 Byte Store
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
765 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
766
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
767
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
768 version( Has64BitOps )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
769 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
770 ////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
771 // 8 Byte Store on 64-Bit Processor
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
772 ////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
773
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
774
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
775 static if( needsStoreBarrier!(ms) )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
776 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
777 asm
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
778 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
779 mov RAX, val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
780 mov RDX, newval;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
781 lock;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
782 xchg [RAX], RDX;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
783 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
784 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
785 else
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
786 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
787 asm
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
788 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
789 mov RAX, val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
790 mov RDX, newval;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
791 mov [RAX], RDX;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
792 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
793 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
794 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
795 else
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
796 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
797 ////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
798 // 8 Byte Store on 32-Bit Processor
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
799 ////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
800
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
801
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
802 pragma( msg, "This operation is only available on 64-bit platforms." );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
803 static assert( false );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
804 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
805 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
806 else
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
807 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
808 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
809 // Not a 1, 2, 4, or 8 Byte Type
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
810 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
811
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
812
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
813 pragma( msg, "Invalid template type specified." );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
814 static assert( false );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
815 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
816 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
817 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
818
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
819
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
820 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
821 // Atomic Store If
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
822 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
823
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
824
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
825 template atomicStoreIf( msync ms = msync.seq, T )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
826 {
325
b460cd08041f dmd 2.037 opEquals bug-feature
eldar1@eldar1-laptop
parents: 291
diff changeset
827 bool atomicStoreIf( ref T val, T newval, T equalTo )
291
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
828 in
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
829 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
830 // NOTE: 32 bit x86 systems support 8 byte CAS, which only requires
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
831 // 4 byte alignment, so use size_t as the align type here.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
832 static if( T.sizeof > size_t.sizeof )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
833 assert( atomicValueIsProperlyAligned!(size_t)( cast(size_t) &val ) );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
834 else
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
835 assert( atomicValueIsProperlyAligned!(T)( cast(size_t) &val ) );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
836 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
837 body
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
838 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
839 static if( T.sizeof == byte.sizeof )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
840 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
841 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
842 // 1 Byte StoreIf
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
843 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
844
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
845
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
846 asm
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
847 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
848 mov DL, newval;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
849 mov AL, equalTo;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
850 mov ECX, val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
851 lock; // lock always needed to make this op atomic
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
852 cmpxchg [ECX], DL;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
853 setz AL;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
854 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
855 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
856 else static if( T.sizeof == short.sizeof )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
857 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
858 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
859 // 2 Byte StoreIf
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
860 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
861
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
862
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
863 asm
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
864 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
865 mov DX, newval;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
866 mov AX, equalTo;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
867 mov ECX, val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
868 lock; // lock always needed to make this op atomic
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
869 cmpxchg [ECX], DX;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
870 setz AL;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
871 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
872 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
873 else static if( T.sizeof == int.sizeof )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
874 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
875 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
876 // 4 Byte StoreIf
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
877 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
878
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
879
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
880 asm
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
881 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
882 mov EDX, newval;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
883 mov EAX, equalTo;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
884 mov ECX, val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
885 lock; // lock always needed to make this op atomic
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
886 cmpxchg [ECX], EDX;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
887 setz AL;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
888 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
889 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
890 else static if( T.sizeof == long.sizeof )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
891 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
892 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
893 // 8 Byte StoreIf
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
894 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
895
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
896
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
897 version( Has64BitOps )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
898 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
899 ////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
900 // 8 Byte StoreIf on 64-Bit Processor
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
901 ////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
902
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
903
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
904 asm
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
905 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
906 mov RDX, newval;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
907 mov RAX, equalTo;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
908 mov RCX, val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
909 lock; // lock always needed to make this op atomic
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
910 cmpxchg [RCX], RDX;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
911 setz AL;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
912 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
913 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
914 else version( Has64BitCAS )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
915 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
916 ////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
917 // 8 Byte StoreIf on 32-Bit Processor
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
918 ////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
919 version(darwin){
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
920 static if(ms==msync.raw){
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
921 return OSAtomicCompareAndSwap64(cast(long)equalTo, cast(long)newval, cast(long*)&val);
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
922 } else {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
923 return OSAtomicCompareAndSwap64Barrier(cast(long)equalTo, cast(long)newval, cast(long*)&val);
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
924 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
925 } else {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
926 asm
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
927 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
928 push EDI;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
929 push EBX;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
930 lea EDI, newval;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
931 mov EBX, [EDI];
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
932 mov ECX, 4[EDI];
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
933 lea EDI, equalTo;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
934 mov EAX, [EDI];
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
935 mov EDX, 4[EDI];
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
936 mov EDI, val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
937 lock; // lock always needed to make this op atomic
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
938 cmpxch8b [EDI];
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
939 setz AL;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
940 pop EBX;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
941 pop EDI;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
942 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
943 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
944 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
945 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
946 else
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
947 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
948 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
949 // Not a 1, 2, 4, or 8 Byte Type
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
950 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
951
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
952
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
953 pragma( msg, "Invalid template type specified." );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
954 static assert( false );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
955 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
956 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
957 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
958
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
959
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
960 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
961 // Atomic Increment
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
962 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
963
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
964
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
965 template atomicIncrement( msync ms = msync.seq, T )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
966 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
967 //
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
968 // NOTE: This operation is only valid for integer or pointer types
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
969 //
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
970 static assert( isValidNumericType!(T) );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
971
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
972
325
b460cd08041f dmd 2.037 opEquals bug-feature
eldar1@eldar1-laptop
parents: 291
diff changeset
973 T atomicIncrement( ref T val )
291
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
974 in
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
975 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
976 assert( atomicValueIsProperlyAligned!(T)( cast(size_t) &val ) );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
977 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
978 body
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
979 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
980 static if( T.sizeof == byte.sizeof )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
981 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
982 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
983 // 1 Byte Increment
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
984 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
985
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
986
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
987 asm
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
988 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
989 mov EAX, val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
990 lock; // lock always needed to make this op atomic
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
991 inc [EAX];
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
992 mov AL, [EAX];
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
993 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
994 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
995 else static if( T.sizeof == short.sizeof )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
996 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
997 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
998 // 2 Byte Increment
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
999 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1000
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1001
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1002 asm
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1003 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1004 mov EAX, val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1005 lock; // lock always needed to make this op atomic
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1006 inc short ptr [EAX];
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1007 mov AX, [EAX];
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1008 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1009 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1010 else static if( T.sizeof == int.sizeof )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1011 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1012 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1013 // 4 Byte Increment
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1014 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1015
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1016
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1017 asm
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1018 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1019 mov EAX, val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1020 lock; // lock always needed to make this op atomic
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1021 inc int ptr [EAX];
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1022 mov EAX, [EAX];
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1023 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1024 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1025 else static if( T.sizeof == long.sizeof )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1026 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1027 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1028 // 8 Byte Increment
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1029 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1030
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1031
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1032 version( Has64BitOps )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1033 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1034 ////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1035 // 8 Byte Increment on 64-Bit Processor
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1036 ////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1037
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1038
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1039 asm
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1040 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1041 mov RAX, val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1042 lock; // lock always needed to make this op atomic
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1043 inc qword ptr [RAX];
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1044 mov RAX, [RAX];
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1045 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1046 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1047 else
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1048 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1049 ////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1050 // 8 Byte Increment on 32-Bit Processor
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1051 ////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1052
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1053
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1054 pragma( msg, "This operation is only available on 64-bit platforms." );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1055 static assert( false );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1056 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1057 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1058 else
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1059 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1060 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1061 // Not a 1, 2, 4, or 8 Byte Type
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1062 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1063
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1064
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1065 pragma( msg, "Invalid template type specified." );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1066 static assert( false );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1067 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1068 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1069 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1070
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1071
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1072 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1073 // Atomic Decrement
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1074 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1075
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1076
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1077 template atomicDecrement( msync ms = msync.seq, T )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1078 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1079 //
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1080 // NOTE: This operation is only valid for integer or pointer types
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1081 //
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1082 static assert( isValidNumericType!(T) );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1083
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1084
325
b460cd08041f dmd 2.037 opEquals bug-feature
eldar1@eldar1-laptop
parents: 291
diff changeset
1085 T atomicDecrement( ref T val )
291
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1086 in
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1087 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1088 assert( atomicValueIsProperlyAligned!(T)( cast(size_t) &val ) );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1089 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1090 body
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1091 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1092 static if( T.sizeof == byte.sizeof )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1093 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1094 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1095 // 1 Byte Decrement
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1096 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1097
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1098
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1099 asm
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1100 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1101 mov EAX, val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1102 lock; // lock always needed to make this op atomic
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1103 dec [EAX];
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1104 mov AL, [EAX];
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1105 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1106 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1107 else static if( T.sizeof == short.sizeof )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1108 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1109 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1110 // 2 Byte Decrement
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1111 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1112
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1113
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1114 asm
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1115 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1116 mov EAX, val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1117 lock; // lock always needed to make this op atomic
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1118 dec short ptr [EAX];
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1119 mov AX, [EAX];
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1120 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1121 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1122 else static if( T.sizeof == int.sizeof )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1123 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1124 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1125 // 4 Byte Decrement
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1126 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1127
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1128
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1129 asm
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1130 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1131 mov EAX, val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1132 lock; // lock always needed to make this op atomic
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1133 dec int ptr [EAX];
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1134 mov EAX, [EAX];
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1135 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1136 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1137 else static if( T.sizeof == long.sizeof )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1138 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1139 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1140 // 8 Byte Decrement
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1141 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1142
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1143
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1144 version( Has64BitOps )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1145 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1146 ////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1147 // 8 Byte Decrement on 64-Bit Processor
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1148 ////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1149
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1150
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1151 asm
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1152 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1153 mov RAX, val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1154 lock; // lock always needed to make this op atomic
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1155 dec qword ptr [RAX];
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1156 mov RAX, [RAX];
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1157 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1158 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1159 else
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1160 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1161 ////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1162 // 8 Byte Decrement on 32-Bit Processor
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1163 ////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1164
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1165
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1166 pragma( msg, "This operation is only available on 64-bit platforms." );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1167 static assert( false );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1168 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1169 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1170 else
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1171 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1172 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1173 // Not a 1, 2, 4, or 8 Byte Type
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1174 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1175
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1176
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1177 pragma( msg, "Invalid template type specified." );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1178 static assert( false );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1179 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1180 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1181 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1182 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1183 else
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1184 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1185 version( BuildInfo )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1186 {
357
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 344
diff changeset
1187 pragma( msg, "qtd.Atomic: using synchronized ops" );
291
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1188 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1189
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1190 private
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1191 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1192 ////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1193 // Default Value Requirements
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1194 ////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1195
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1196
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1197 template atomicValueIsProperlyAligned( T )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1198 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1199 bool atomicValueIsProperlyAligned( size_t addr )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1200 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1201 return addr % T.sizeof == 0;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1202 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1203 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1204
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1205
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1206 ////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1207 // Default Synchronization Requirements
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1208 ////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1209
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1210
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1211 template needsLoadBarrier( msync ms )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1212 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1213 const bool needsLoadBarrier = ms != msync.raw;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1214 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1215
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1216
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1217 template needsStoreBarrier( msync ms )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1218 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1219 const bool needsStoreBarrier = ms != msync.raw;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1220 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1221 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1222
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1223
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1224 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1225 // Atomic Load
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1226 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1227
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1228
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1229 template atomicLoad( msync ms = msync.seq, T )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1230 {
325
b460cd08041f dmd 2.037 opEquals bug-feature
eldar1@eldar1-laptop
parents: 291
diff changeset
1231 T atomicLoad( ref T val )
291
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1232 in
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1233 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1234 assert( atomicValueIsProperlyAligned!(T)( cast(size_t) &val ) );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1235 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1236 body
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1237 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1238 static if( T.sizeof <= (void*).sizeof )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1239 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1240 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1241 // <= (void*).sizeof Byte Load
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1242 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1243
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1244
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1245 static if( needsLoadBarrier!(ms) )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1246 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1247 synchronized
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1248 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1249 return val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1250 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1251 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1252 else
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1253 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1254 synchronized
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1255 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1256 return val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1257 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1258 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1259 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1260 else
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1261 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1262 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1263 // > (void*).sizeof Byte Type
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1264 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1265
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1266
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1267 pragma( msg, "Invalid template type specified." );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1268 static assert( false );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1269 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1270 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1271 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1272
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1273
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1274 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1275 // Atomic Store
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1276 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1277
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1278
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1279 template atomicStore( msync ms = msync.seq, T )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1280 {
325
b460cd08041f dmd 2.037 opEquals bug-feature
eldar1@eldar1-laptop
parents: 291
diff changeset
1281 void atomicStore( ref T val, T newval )
291
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1282 in
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1283 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1284 assert( atomicValueIsProperlyAligned!(T)( cast(size_t) &val ) );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1285 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1286 body
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1287 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1288 static if( T.sizeof <= (void*).sizeof )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1289 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1290 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1291 // <= (void*).sizeof Byte Store
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1292 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1293
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1294
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1295 static if( needsStoreBarrier!(ms) )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1296 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1297 synchronized
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1298 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1299 val = newval;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1300 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1301 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1302 else
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1303 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1304 synchronized
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1305 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1306 val = newval;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1307 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1308 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1309 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1310 else
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1311 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1312 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1313 // > (void*).sizeof Byte Type
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1314 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1315
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1316
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1317 pragma( msg, "Invalid template type specified." );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1318 static assert( false );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1319 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1320 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1321 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1322
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1323
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1324 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1325 // Atomic Store If
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1326 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1327
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1328
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1329 template atomicStoreIf( msync ms = msync.seq, T )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1330 {
325
b460cd08041f dmd 2.037 opEquals bug-feature
eldar1@eldar1-laptop
parents: 291
diff changeset
1331 bool atomicStoreIf( ref T val, T newval, T equalTo )
291
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1332 in
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1333 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1334 assert( atomicValueIsProperlyAligned!(T)( cast(size_t) &val ) );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1335 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1336 body
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1337 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1338 static if( T.sizeof <= (void*).sizeof )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1339 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1340 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1341 // <= (void*).sizeof Byte StoreIf
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1342 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1343
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1344
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1345 synchronized
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1346 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1347 if( val == equalTo )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1348 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1349 val = newval;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1350 return true;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1351 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1352 return false;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1353 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1354 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1355 else
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1356 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1357 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1358 // > (void*).sizeof Byte Type
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1359 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1360
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1361
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1362 pragma( msg, "Invalid template type specified." );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1363 static assert( false );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1364 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1365 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1366 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1367
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1368
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1369 /////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1370 // Atomic Increment
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1371 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1372
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1373
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1374 template atomicIncrement( msync ms = msync.seq, T )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1375 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1376 //
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1377 // NOTE: This operation is only valid for integer or pointer types
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1378 //
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1379 static assert( isValidNumericType!(T) );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1380
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1381
325
b460cd08041f dmd 2.037 opEquals bug-feature
eldar1@eldar1-laptop
parents: 291
diff changeset
1382 T atomicIncrement( ref T val )
291
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1383 in
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1384 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1385 assert( atomicValueIsProperlyAligned!(T)( cast(size_t) &val ) );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1386 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1387 body
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1388 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1389 static if( T.sizeof <= (void*).sizeof )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1390 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1391 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1392 // <= (void*).sizeof Byte Increment
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1393 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1394
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1395
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1396 synchronized
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1397 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1398 return ++val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1399 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1400 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1401 else
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1402 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1403 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1404 // > (void*).sizeof Byte Type
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1405 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1406
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1407
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1408 pragma( msg, "Invalid template type specified." );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1409 static assert( false );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1410 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1411 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1412 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1413
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1414
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1415 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1416 // Atomic Decrement
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1417 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1418
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1419
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1420 template atomicDecrement( msync ms = msync.seq, T )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1421 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1422 //
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1423 // NOTE: This operation is only valid for integer or pointer types
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1424 //
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1425 static assert( isValidNumericType!(T) );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1426
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1427
325
b460cd08041f dmd 2.037 opEquals bug-feature
eldar1@eldar1-laptop
parents: 291
diff changeset
1428 T atomicDecrement( ref T val )
291
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1429 in
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1430 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1431 assert( atomicValueIsProperlyAligned!(T)( cast(size_t) &val ) );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1432 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1433 body
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1434 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1435 static if( T.sizeof <= (void*).sizeof )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1436 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1437 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1438 // <= (void*).sizeof Byte Decrement
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1439 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1440
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1441
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1442 synchronized
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1443 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1444 return --val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1445 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1446 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1447 else
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1448 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1449 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1450 // > (void*).sizeof Byte Type
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1451 ////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1452
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1453
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1454 pragma( msg, "Invalid template type specified." );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1455 static assert( false );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1456 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1457 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1458 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1459 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1460
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1461
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1462 ////////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1463 // Atomic
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1464 ////////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1465
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1466
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1467 /**
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1468 * This struct represents a value which will be subject to competing access.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1469 * All accesses to this value will be synchronized with main memory, and
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1470 * various memory barriers may be employed for instruction ordering. Any
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1471 * primitive type of size equal to or smaller than the memory bus size is
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1472 * allowed, so 32-bit machines may use values with size <= int.sizeof and
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1473 * 64-bit machines may use values with size <= long.sizeof. The one exception
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1474 * to this rule is that architectures that support DCAS will allow double-wide
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1475 * storeIf operations. The 32-bit x86 architecture, for example, supports
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1476 * 64-bit storeIf operations.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1477 */
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1478 struct Atomic( T )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1479 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1480 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1481 // Atomic Load
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1482 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1483
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1484
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1485 template load( msync ms = msync.seq )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1486 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1487 static assert( ms == msync.raw || ms == msync.hlb ||
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1488 ms == msync.acq || ms == msync.seq,
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1489 "ms must be one of: msync.raw, msync.hlb, msync.acq, msync.seq" );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1490
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1491 /**
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1492 * Refreshes the contents of this value from main memory. This
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1493 * operation is both lock-free and atomic.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1494 *
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1495 * Returns:
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1496 * The loaded value.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1497 */
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1498 T load()
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1499 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1500 return atomicLoad!(ms,T)( m_val );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1501 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1502 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1503
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1504
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1505 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1506 // Atomic Store
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1507 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1508
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1509
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1510 template store( msync ms = msync.seq )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1511 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1512 static assert( ms == msync.raw || ms == msync.ssb ||
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1513 ms == msync.acq || ms == msync.rel ||
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1514 ms == msync.seq,
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1515 "ms must be one of: msync.raw, msync.ssb, msync.acq, msync.rel, msync.seq" );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1516
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1517 /**
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1518 * Stores 'newval' to the memory referenced by this value. This
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1519 * operation is both lock-free and atomic.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1520 *
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1521 * Params:
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1522 * newval = The value to store.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1523 */
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1524 void store( T newval )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1525 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1526 atomicStore!(ms,T)( m_val, newval );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1527 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1528 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1529
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1530
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1531 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1532 // Atomic StoreIf
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1533 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1534
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1535
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1536 template storeIf( msync ms = msync.seq )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1537 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1538 static assert( ms == msync.raw || ms == msync.ssb ||
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1539 ms == msync.acq || ms == msync.rel ||
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1540 ms == msync.seq,
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1541 "ms must be one of: msync.raw, msync.ssb, msync.acq, msync.rel, msync.seq" );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1542
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1543 /**
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1544 * Stores 'newval' to the memory referenced by this value if val is
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1545 * equal to 'equalTo'. This operation is both lock-free and atomic.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1546 *
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1547 * Params:
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1548 * newval = The value to store.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1549 * equalTo = The comparison value.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1550 *
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1551 * Returns:
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1552 * true if the store occurred, false if not.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1553 */
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1554 bool storeIf( T newval, T equalTo )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1555 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1556 return atomicStoreIf!(ms,T)( m_val, newval, equalTo );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1557 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1558 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1559
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1560
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1561 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1562 // Numeric Functions
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1563 ////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1564
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1565
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1566 /**
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1567 * The following additional functions are available for integer types.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1568 */
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1569 static if( isValidNumericType!(T) )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1570 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1571 ////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1572 // Atomic Increment
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1573 ////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1574
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1575
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1576 template increment( msync ms = msync.seq )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1577 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1578 static assert( ms == msync.raw || ms == msync.ssb ||
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1579 ms == msync.acq || ms == msync.rel ||
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1580 ms == msync.seq,
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1581 "ms must be one of: msync.raw, msync.ssb, msync.acq, msync.rel, msync.seq" );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1582
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1583 /**
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1584 * This operation is only legal for built-in value and pointer
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1585 * types, and is equivalent to an atomic "val = val + 1" operation.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1586 * This function exists to facilitate use of the optimized
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1587 * increment instructions provided by some architecures. If no
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1588 * such instruction exists on the target platform then the
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1589 * behavior will perform the operation using more traditional
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1590 * means. This operation is both lock-free and atomic.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1591 *
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1592 * Returns:
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1593 * The result of an atomicLoad of val immediately following the
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1594 * increment operation. This value is not required to be equal to
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1595 * the newly stored value. Thus, competing writes are allowed to
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1596 * occur between the increment and successive load operation.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1597 */
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1598 T increment()
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1599 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1600 return atomicIncrement!(ms,T)( m_val );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1601 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1602 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1603
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1604
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1605 ////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1606 // Atomic Decrement
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1607 ////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1608
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1609
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1610 template decrement( msync ms = msync.seq )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1611 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1612 static assert( ms == msync.raw || ms == msync.ssb ||
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1613 ms == msync.acq || ms == msync.rel ||
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1614 ms == msync.seq,
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1615 "ms must be one of: msync.raw, msync.ssb, msync.acq, msync.rel, msync.seq" );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1616
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1617 /**
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1618 * This operation is only legal for built-in value and pointer
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1619 * types, and is equivalent to an atomic "val = val - 1" operation.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1620 * This function exists to facilitate use of the optimized
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1621 * decrement instructions provided by some architecures. If no
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1622 * such instruction exists on the target platform then the behavior
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1623 * will perform the operation using more traditional means. This
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1624 * operation is both lock-free and atomic.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1625 *
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1626 * Returns:
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1627 * The result of an atomicLoad of val immediately following the
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1628 * increment operation. This value is not required to be equal to
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1629 * the newly stored value. Thus, competing writes are allowed to
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1630 * occur between the increment and successive load operation.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1631 */
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1632 T decrement()
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1633 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1634 return atomicDecrement!(ms,T)( m_val );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1635 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1636 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1637 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1638
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1639 private:
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1640 T m_val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1641 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1642
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1643
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1644 ////////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1645 // Support Code for Unit Tests
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1646 ////////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1647
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1648
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1649 private
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1650 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1651 version( D_Ddoc ) {} else
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1652 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1653 template testLoad( msync ms, T )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1654 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1655 void testLoad( T val = T.init + 1 )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1656 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1657 T base;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1658 Atomic!(T) atom;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1659
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1660 assert( atom.load!(ms)() == base );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1661 base = val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1662 atom.m_val = val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1663 assert( atom.load!(ms)() == base );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1664 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1665 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1666
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1667
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1668 template testStore( msync ms, T )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1669 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1670 void testStore( T val = T.init + 1 )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1671 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1672 T base;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1673 Atomic!(T) atom;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1674
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1675 assert( atom.m_val == base );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1676 base = val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1677 atom.store!(ms)( base );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1678 assert( atom.m_val == base );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1679 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1680 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1681
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1682
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1683 template testStoreIf( msync ms, T )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1684 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1685 void testStoreIf( T val = T.init + 1 )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1686 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1687 T base;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1688 Atomic!(T) atom;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1689
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1690 assert( atom.m_val == base );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1691 base = val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1692 atom.storeIf!(ms)( base, val );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1693 assert( atom.m_val != base );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1694 atom.storeIf!(ms)( base, T.init );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1695 assert( atom.m_val == base );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1696 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1697 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1698
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1699
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1700 template testIncrement( msync ms, T )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1701 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1702 void testIncrement( T val = T.init + 1 )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1703 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1704 T base = val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1705 T incr = val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1706 Atomic!(T) atom;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1707
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1708 atom.m_val = val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1709 assert( atom.m_val == base && incr == base );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1710 base = cast(T)( base + 1 );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1711 incr = atom.increment!(ms)();
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1712 assert( atom.m_val == base && incr == base );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1713 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1714 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1715
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1716
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1717 template testDecrement( msync ms, T )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1718 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1719 void testDecrement( T val = T.init + 1 )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1720 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1721 T base = val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1722 T decr = val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1723 Atomic!(T) atom;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1724
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1725 atom.m_val = val;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1726 assert( atom.m_val == base && decr == base );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1727 base = cast(T)( base - 1 );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1728 decr = atom.decrement!(ms)();
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1729 assert( atom.m_val == base && decr == base );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1730 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1731 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1732
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1733
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1734 template testType( T )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1735 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1736 void testType( T val = T.init +1 )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1737 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1738 testLoad!(msync.raw, T)( val );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1739 testLoad!(msync.hlb, T)( val );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1740 testLoad!(msync.acq, T)( val );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1741 testLoad!(msync.seq, T)( val );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1742
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1743 testStore!(msync.raw, T)( val );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1744 testStore!(msync.ssb, T)( val );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1745 testStore!(msync.acq, T)( val );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1746 testStore!(msync.rel, T)( val );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1747 testStore!(msync.seq, T)( val );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1748
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1749 testStoreIf!(msync.raw, T)( val );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1750 testStoreIf!(msync.ssb, T)( val );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1751 testStoreIf!(msync.acq, T)( val );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1752 testStoreIf!(msync.rel, T)( val );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1753 testStoreIf!(msync.seq, T)( val );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1754
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1755 static if( isValidNumericType!(T) )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1756 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1757 testIncrement!(msync.raw, T)( val );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1758 testIncrement!(msync.ssb, T)( val );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1759 testIncrement!(msync.acq, T)( val );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1760 testIncrement!(msync.rel, T)( val );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1761 testIncrement!(msync.seq, T)( val );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1762
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1763 testDecrement!(msync.raw, T)( val );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1764 testDecrement!(msync.ssb, T)( val );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1765 testDecrement!(msync.acq, T)( val );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1766 testDecrement!(msync.rel, T)( val );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1767 testDecrement!(msync.seq, T)( val );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1768 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1769 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1770 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1771 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1772 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1773
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1774
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1775 ////////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1776 // Unit Tests
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1777 ////////////////////////////////////////////////////////////////////////////////
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1778
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1779
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1780 debug( UnitTest )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1781 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1782 unittest
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1783 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1784 testType!(bool)();
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1785
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1786 testType!(byte)();
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1787 testType!(ubyte)();
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1788
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1789 testType!(short)();
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1790 testType!(ushort)();
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1791
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1792 testType!(int)();
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1793 testType!(uint)();
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1794
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1795 int x;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1796 testType!(void*)( &x );
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1797
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1798 version( Has64BitOps )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1799 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1800 testType!(long)();
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1801 testType!(ulong)();
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1802 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1803 else version( Has64BitCAS )
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1804 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1805 testStoreIf!(msync.raw, long)();
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1806 testStoreIf!(msync.ssb, long)();
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1807 testStoreIf!(msync.acq, long)();
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1808 testStoreIf!(msync.rel, long)();
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1809 testStoreIf!(msync.seq, long)();
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1810
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1811 testStoreIf!(msync.raw, ulong)();
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1812 testStoreIf!(msync.ssb, ulong)();
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1813 testStoreIf!(msync.acq, ulong)();
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1814 testStoreIf!(msync.rel, ulong)();
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1815 testStoreIf!(msync.seq, ulong)();
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1816 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1817 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1818 }