| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #ifndef SkAtomics_DEFINED | 8 #ifndef SkAtomics_DEFINED |
| 9 #define SkAtomics_DEFINED | 9 #define SkAtomics_DEFINED |
| 10 | 10 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 36 | 36 |
| 37 template <typename T> | 37 template <typename T> |
| 38 T sk_atomic_exchange(T*, T, sk_memory_order = sk_memory_order_seq_cst); | 38 T sk_atomic_exchange(T*, T, sk_memory_order = sk_memory_order_seq_cst); |
| 39 | 39 |
| 40 // 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 |
| 41 // 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>. |
| 42 template <typename T> | 42 template <typename T> |
| 43 class SkAtomic : SkNoncopyable { | 43 class SkAtomic : SkNoncopyable { |
| 44 public: | 44 public: |
| 45 SkAtomic() {} | 45 SkAtomic() {} |
| 46 explicit SkAtomic(const T& val) : fVal(val) {} |
| 46 | 47 |
| 47 // It is essential we return by value rather than by const&. fVal may chang
e at any time. | 48 // It is essential we return by value rather than by const&. fVal may chang
e at any time. |
| 48 T load(sk_memory_order mo = sk_memory_order_seq_cst) const { | 49 T load(sk_memory_order mo = sk_memory_order_seq_cst) const { |
| 49 return sk_atomic_load(&fVal, mo); | 50 return sk_atomic_load(&fVal, mo); |
| 50 } | 51 } |
| 51 | 52 |
| 52 void store(const T& val, sk_memory_order mo = sk_memory_order_seq_cst) { | 53 void store(const T& val, sk_memory_order mo = sk_memory_order_seq_cst) { |
| 53 sk_atomic_store(&fVal, val, mo); | 54 sk_atomic_store(&fVal, val, mo); |
| 54 } | 55 } |
| 55 | 56 |
| 57 T fetch_add(const T& val, sk_memory_order mo = sk_memory_order_seq_cst) { |
| 58 return sk_atomic_fetch_add(&fVal, val, mo); |
| 59 } |
| 60 |
| 56 bool compare_exchange(T* expected, const T& desired, | 61 bool compare_exchange(T* expected, const T& desired, |
| 57 sk_memory_order success = sk_memory_order_seq_cst, | 62 sk_memory_order success = sk_memory_order_seq_cst, |
| 58 sk_memory_order failure = sk_memory_order_seq_cst) { | 63 sk_memory_order failure = sk_memory_order_seq_cst) { |
| 59 return sk_atomic_compare_exchange(&fVal, expected, desired, success, fai
lure); | 64 return sk_atomic_compare_exchange(&fVal, expected, desired, success, fai
lure); |
| 60 } | 65 } |
| 61 private: | 66 private: |
| 62 T fVal; | 67 T fVal; |
| 63 }; | 68 }; |
| 64 | 69 |
| 65 #if defined(_MSC_VER) | 70 #if defined(_MSC_VER) |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 102 template <typename T> | 107 template <typename T> |
| 103 T sk_acquire_load(T* ptr) { return sk_atomic_load(ptr, sk_memory_order_acquire);
} | 108 T sk_acquire_load(T* ptr) { return sk_atomic_load(ptr, sk_memory_order_acquire);
} |
| 104 | 109 |
| 105 template <typename T> | 110 template <typename T> |
| 106 void sk_release_store(T* ptr, T val) { sk_atomic_store(ptr, val, sk_memory_order
_release); } | 111 void sk_release_store(T* ptr, T val) { sk_atomic_store(ptr, val, sk_memory_order
_release); } |
| 107 | 112 |
| 108 inline void sk_membar_acquire__after_atomic_dec() {} | 113 inline void sk_membar_acquire__after_atomic_dec() {} |
| 109 inline void sk_membar_acquire__after_atomic_conditional_inc() {} | 114 inline void sk_membar_acquire__after_atomic_conditional_inc() {} |
| 110 | 115 |
| 111 #endif//SkAtomics_DEFINED | 116 #endif//SkAtomics_DEFINED |
| OLD | NEW |