Updated atomic design docs
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@116065 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ffb9a4e235
commit
08f2969220
@ -53,6 +53,40 @@ should be identical (and conforming) for all three designs.
|
|||||||
</li>
|
</li>
|
||||||
</ol>
|
</ol>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
With any design, the (back end) compiler writer should note:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<p>
|
||||||
|
The decision to implement lock-free operations on any given type (or not) is an
|
||||||
|
ABI-binding decision. One can not change from treating a type as not lock free,
|
||||||
|
to lock free (or vice-versa) without breaking your ABI.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Example:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<blockquote><pre>
|
||||||
|
TU1.cc
|
||||||
|
-----------
|
||||||
|
extern atomic<long long> A;
|
||||||
|
int foo() { return A.compare_exchange_strong(w, x); }
|
||||||
|
|
||||||
|
TU2.cc
|
||||||
|
-----------
|
||||||
|
extern atomic<long long> A;
|
||||||
|
void bar() { return A.compare_exchange_strong(y, z); }
|
||||||
|
</pre></blockquote>
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
If only <em>one</em> of these calls to <tt>compare_exchange_strong</tt> is
|
||||||
|
implemented with mutex-locked code, then that mutex-locked code will not be
|
||||||
|
executed mutually exclusively of the one implemented in a lock-free manner.
|
||||||
|
</p>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -49,6 +49,9 @@ the memory ordering parameter.
|
|||||||
<font color="#C80000">// In every intrinsic signature below, type* atomic_obj may be a pointer to a</font>
|
<font color="#C80000">// In every intrinsic signature below, type* atomic_obj may be a pointer to a</font>
|
||||||
<font color="#C80000">// volatile-qualifed type.</font>
|
<font color="#C80000">// volatile-qualifed type.</font>
|
||||||
|
|
||||||
|
<font color="#C80000">// type must be trivially copyable</font>
|
||||||
|
bool __atomic_is_lock_free(const type* atomic_obj);
|
||||||
|
|
||||||
<font color="#C80000">// type must be trivially copyable</font>
|
<font color="#C80000">// type must be trivially copyable</font>
|
||||||
<font color="#C80000">// Behavior is defined for mem_ord = 0, 1, 2, 5</font>
|
<font color="#C80000">// Behavior is defined for mem_ord = 0, 1, 2, 5</font>
|
||||||
type __atomic_load(const type* atomic_obj, int mem_ord);
|
type __atomic_load(const type* atomic_obj, int mem_ord);
|
||||||
|
@ -44,18 +44,21 @@ option in the spirit of completeness.
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<blockquote><pre>
|
<blockquote><pre>
|
||||||
<font color="#C80000">// type can be any pod</font>
|
<font color="#C80000">// type must be trivially copyable</font>
|
||||||
|
bool __atomic_is_lock_free(const type* atomic_obj);
|
||||||
|
|
||||||
|
<font color="#C80000">// type must be trivially copyable</font>
|
||||||
type __atomic_load_relaxed(const volatile type* atomic_obj);
|
type __atomic_load_relaxed(const volatile type* atomic_obj);
|
||||||
type __atomic_load_consume(const volatile type* atomic_obj);
|
type __atomic_load_consume(const volatile type* atomic_obj);
|
||||||
type __atomic_load_acquire(const volatile type* atomic_obj);
|
type __atomic_load_acquire(const volatile type* atomic_obj);
|
||||||
type __atomic_load_seq_cst(const volatile type* atomic_obj);
|
type __atomic_load_seq_cst(const volatile type* atomic_obj);
|
||||||
|
|
||||||
<font color="#C80000">// type can be any pod</font>
|
<font color="#C80000">// type must be trivially copyable</font>
|
||||||
type __atomic_store_relaxed(volatile type* atomic_obj, type desired);
|
type __atomic_store_relaxed(volatile type* atomic_obj, type desired);
|
||||||
type __atomic_store_release(volatile type* atomic_obj, type desired);
|
type __atomic_store_release(volatile type* atomic_obj, type desired);
|
||||||
type __atomic_store_seq_cst(volatile type* atomic_obj, type desired);
|
type __atomic_store_seq_cst(volatile type* atomic_obj, type desired);
|
||||||
|
|
||||||
<font color="#C80000">// type can be any pod</font>
|
<font color="#C80000">// type must be trivially copyable</font>
|
||||||
type __atomic_exchange_relaxed(volatile type* atomic_obj, type desired);
|
type __atomic_exchange_relaxed(volatile type* atomic_obj, type desired);
|
||||||
type __atomic_exchange_consume(volatile type* atomic_obj, type desired);
|
type __atomic_exchange_consume(volatile type* atomic_obj, type desired);
|
||||||
type __atomic_exchange_acquire(volatile type* atomic_obj, type desired);
|
type __atomic_exchange_acquire(volatile type* atomic_obj, type desired);
|
||||||
@ -63,7 +66,7 @@ type __atomic_exchange_release(volatile type* atomic_obj, type desired);
|
|||||||
type __atomic_exchange_acq_rel(volatile type* atomic_obj, type desired);
|
type __atomic_exchange_acq_rel(volatile type* atomic_obj, type desired);
|
||||||
type __atomic_exchange_seq_cst(volatile type* atomic_obj, type desired);
|
type __atomic_exchange_seq_cst(volatile type* atomic_obj, type desired);
|
||||||
|
|
||||||
<font color="#C80000">// type can be any pod</font>
|
<font color="#C80000">// type must be trivially copyable</font>
|
||||||
bool __atomic_compare_exchange_strong_relaxed_relaxed(volatile type* atomic_obj,
|
bool __atomic_compare_exchange_strong_relaxed_relaxed(volatile type* atomic_obj,
|
||||||
type* expected,
|
type* expected,
|
||||||
type desired);
|
type desired);
|
||||||
@ -113,7 +116,7 @@ bool __atomic_compare_exchange_strong_seq_cst_seq_cst(volatile type* atomic_obj,
|
|||||||
type* expected,
|
type* expected,
|
||||||
type desired);
|
type desired);
|
||||||
|
|
||||||
<font color="#C80000">// type can be any pod</font>
|
<font color="#C80000">// type must be trivially copyable</font>
|
||||||
bool __atomic_compare_exchange_weak_relaxed_relaxed(volatile type* atomic_obj,
|
bool __atomic_compare_exchange_weak_relaxed_relaxed(volatile type* atomic_obj,
|
||||||
type* expected,
|
type* expected,
|
||||||
type desired);
|
type desired);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user