<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">The further we get with adding concurrency features to D the more I find myself wishing there were a module for doing atomic ops in Druntime. &nbsp;I have one sitting around that I'd love to roll in if it passes muster. &nbsp;It's based on Alexander Terekhov's atomic&lt;&gt; class proposed in comp.programming.threads ages ago, and is very similar to a subset of what the C++ 0x committee settled on--the relevant portion of the C++ 0x proposal is here:<div><br></div><div><a href="http://www.open-std.org/JTC1/sc22/wg21/docs/papers/2007/n2427.html#ImplFunctions">http://www.open-std.org/JTC1/sc22/wg21/docs/papers/2007/n2427.html#ImplFunctions</a></div><div><br></div><div>Here's an outline of the API:</div><div><br></div><div><span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 12px; ">T atomicLoad(msync ms = msync.seq, T)( ref T val );</span></div><div><font class="Apple-style-span" face="'Courier New'">void atomicStore(msync ms = msync.seq, T)( inout T val, T newval );</font></div><div><font class="Apple-style-span" face="'Courier New'">bool atomicStoreIf(msync ms = msync.seq, T)( inout T val, T newval, T equalTo );</font></div><div><font class="Apple-style-span" face="'Courier New'">T atomicIncrement(msync ms = msync.seq, T)( inout T val );</font></div><div><font class="Apple-style-span" face="'Courier New'">T atomicDecrement(msync ms = msync.seq, T)( inout T val );</font></div><div><font class="Apple-style-span" face="'Courier New'"><br></font></div><div><font class="Apple-style-span" face="'Courier New'">struct Atomic(T)</font></div><div><font class="Apple-style-span" face="'Courier New'">{</font></div><div><font class="Apple-style-span" face="'Courier New'">&nbsp;&nbsp; &nbsp;T load(msync ms = msync.seq)();</font></div><div><font class="Apple-style-span" face="'Courier New'">&nbsp;&nbsp; &nbsp;void store(msync ms = msync.seq)( T val );</font></div><div><font class="Apple-style-span" face="'Courier New'">&nbsp;&nbsp; &nbsp;bool storeIf(msync ms = msync.seq)( T newval, T equalTo );</font></div><div><font class="Apple-style-span" face="'Courier New'">&nbsp;&nbsp;static if( isNumericType!T )</font></div><div><font class="Apple-style-span" face="'Courier New'">&nbsp;&nbsp;{</font></div><div><font class="Apple-style-span" face="'Courier New'">&nbsp;&nbsp; &nbsp;T increment(msync ms = msync.seq)();</font></div><div><font class="Apple-style-span" face="'Courier New'">&nbsp;&nbsp; &nbsp;T decrement(msync ms = msync.seq)();</font></div><div><font class="Apple-style-span" face="'Courier New'">&nbsp;&nbsp;}</font></div><div><font class="Apple-style-span" face="'Courier New'">}</font></div><div><font class="Apple-style-span" face="'Courier New'"><br></font></div><div><font class="Apple-style-span" face="'Courier New'"><span class="Apple-style-span" style="font-family: Helvetica; "><div><font class="Apple-style-span" face="'Courier New'" size="3"><span class="Apple-style-span" style="font-size: 12px; ">enum msync</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="3"><span class="Apple-style-span" style="font-size: 12px; ">{</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="3"><span class="Apple-style-span" style="font-size: 12px; ">&nbsp;&nbsp; &nbsp;raw, &nbsp; &nbsp;/// not sequenced<br>&nbsp;&nbsp; &nbsp;hlb, &nbsp; &nbsp;/// hoist-load barrier<br>&nbsp;&nbsp; &nbsp;hsb, &nbsp; &nbsp;/// hoist-store barrier<br>&nbsp;&nbsp; &nbsp;slb, &nbsp; &nbsp;/// sink-load barrier<br>&nbsp;&nbsp; &nbsp;ssb, &nbsp; &nbsp;/// sink-store barrier<br>&nbsp;&nbsp; &nbsp;acq, &nbsp; &nbsp;/// hoist-load + hoist-store barrier<br>&nbsp;&nbsp; &nbsp;rel, &nbsp; &nbsp;/// sink-load + sink-store barrier<br>&nbsp;&nbsp; &nbsp;seq, &nbsp; &nbsp;/// fully sequenced (acq + rel)</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="3"><span class="Apple-style-span" style="font-size: 12px; ">}</span></font></div><div><font class="Apple-style-span" face="'Courier New'"><br></font></div><div>(atomicStoreIf is equivalent to atomic_compare_swap in C++)</div><div><br></div><div>The Atomic struct could probably be done away with, given the existence of shared in D2, and all but acq, rel, seq, and raw could be eliminated from msync as well. &nbsp;From a functionality standpoint, I think it's fairly minimal for an atomics package, but I'd rather add than cut stuff later.</div></span></font></div></body></html>