OLD | NEW |
| 1 /* |
| 2 * Copyright 2015 Google Inc. |
| 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. |
| 6 */ |
| 7 |
1 #ifndef SkAtomics_DEFINED | 8 #ifndef SkAtomics_DEFINED |
2 #define SkAtomics_DEFINED | 9 #define SkAtomics_DEFINED |
3 | 10 |
4 // This file is not part of the public Skia API. | 11 // This file is not part of the public Skia API. |
5 #include "SkTypes.h" | 12 #include "SkTypes.h" |
6 | 13 |
7 enum sk_memory_order { | 14 enum sk_memory_order { |
8 sk_memory_order_relaxed, | 15 sk_memory_order_relaxed, |
9 sk_memory_order_consume, | 16 sk_memory_order_consume, |
10 sk_memory_order_acquire, | 17 sk_memory_order_acquire, |
11 sk_memory_order_release, | 18 sk_memory_order_release, |
12 sk_memory_order_acq_rel, | 19 sk_memory_order_acq_rel, |
13 sk_memory_order_seq_cst, | 20 sk_memory_order_seq_cst, |
14 }; | 21 }; |
15 | 22 |
16 template <typename T> | 23 template <typename T> |
17 T sk_atomic_load(const T*, sk_memory_order = sk_memory_order_seq_cst); | 24 T sk_atomic_load(const T*, sk_memory_order = sk_memory_order_seq_cst); |
18 | 25 |
19 template <typename T> | 26 template <typename T> |
20 void sk_atomic_store(T*, T, sk_memory_order = sk_memory_order_seq_cst); | 27 void sk_atomic_store(T*, T, sk_memory_order = sk_memory_order_seq_cst); |
21 | 28 |
22 template <typename T> | 29 template <typename T> |
23 T sk_atomic_fetch_add(T*, T, sk_memory_order = sk_memory_order_seq_cst); | 30 T sk_atomic_fetch_add(T*, T, sk_memory_order = sk_memory_order_seq_cst); |
24 | 31 |
25 template <typename T> | 32 template <typename T> |
26 bool sk_atomic_compare_exchange(T*, T* expected, T desired, | 33 bool sk_atomic_compare_exchange(T*, T* expected, T desired, |
27 sk_memory_order success = sk_memory_order_seq_cs
t, | 34 sk_memory_order success = sk_memory_order_seq_cs
t, |
28 sk_memory_order failure = sk_memory_order_seq_cs
t); | 35 sk_memory_order failure = sk_memory_order_seq_cs
t); |
29 | 36 |
| 37 template <typename T> |
| 38 T sk_atomic_exchange(T*, T, sk_memory_order = sk_memory_order_seq_cst); |
| 39 |
30 // A little wrapper class for small T (think, builtins: int, float, void*) to | 40 // A little wrapper class for small T (think, builtins: int, float, void*) to |
31 // ensure they're always used atomically. This is our stand-in for std::atomic<
T>. | 41 // ensure they're always used atomically. This is our stand-in for std::atomic<
T>. |
32 template <typename T> | 42 template <typename T> |
33 class SkAtomic : SkNoncopyable { | 43 class SkAtomic : SkNoncopyable { |
34 public: | 44 public: |
35 SkAtomic() {} | 45 SkAtomic() {} |
36 | 46 |
37 // It is essential we return by value rather than by const&. fVal may chang
e at any time. | 47 // It is essential we return by value rather than by const&. fVal may chang
e at any time. |
38 T load(sk_memory_order mo = sk_memory_order_seq_cst) const { | 48 T load(sk_memory_order mo = sk_memory_order_seq_cst) const { |
39 return sk_atomic_load(&fVal, mo); | 49 return sk_atomic_load(&fVal, mo); |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
92 template <typename T> | 102 template <typename T> |
93 T sk_acquire_load(T* ptr) { return sk_atomic_load(ptr, sk_memory_order_acquire);
} | 103 T sk_acquire_load(T* ptr) { return sk_atomic_load(ptr, sk_memory_order_acquire);
} |
94 | 104 |
95 template <typename T> | 105 template <typename T> |
96 void sk_release_store(T* ptr, T val) { sk_atomic_store(ptr, val, sk_memory_order
_release); } | 106 void sk_release_store(T* ptr, T val) { sk_atomic_store(ptr, val, sk_memory_order
_release); } |
97 | 107 |
98 inline void sk_membar_acquire__after_atomic_dec() {} | 108 inline void sk_membar_acquire__after_atomic_dec() {} |
99 inline void sk_membar_acquire__after_atomic_conditional_inc() {} | 109 inline void sk_membar_acquire__after_atomic_conditional_inc() {} |
100 | 110 |
101 #endif//SkAtomics_DEFINED | 111 #endif//SkAtomics_DEFINED |
OLD | NEW |