diff options
author | 2014-06-06 06:21:46 -0700 | |
---|---|---|
committer | 2014-06-06 06:21:49 -0700 | |
commit | a8928b745a7158a432033a28c49fb0f0450ccf6e (patch) | |
tree | af67477db620a39b0b9aaee8f78fbfdc94fa4127 /src/ports/SkBarriers_tsan.h | |
parent | 594069f0fe63c50cd6b176e218e04f381cc30182 (diff) |
Add SkBarriers_tsan.h.
Slight counterproposal to crrev.com/310663002.
BUG=skia:
No API changes.
R=bungeman@google.com, mtklein@google.com, reed@google.com
Author: mtklein@chromium.org
Review URL: https://codereview.chromium.org/306373002
Diffstat (limited to 'src/ports/SkBarriers_tsan.h')
-rw-r--r-- | src/ports/SkBarriers_tsan.h | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/src/ports/SkBarriers_tsan.h b/src/ports/SkBarriers_tsan.h new file mode 100644 index 0000000000..ae68b3daf9 --- /dev/null +++ b/src/ports/SkBarriers_tsan.h @@ -0,0 +1,48 @@ +/* + * Copyright 2014 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef SkBarriers_tsan_DEFINED +#define SkBarriers_tsan_DEFINED + +#include <sanitizer/tsan_interface_atomic.h> + +static inline void sk_compiler_barrier() { asm volatile("" : : : "memory"); } + +// We'd do this as separate functions, but you can't partially specialize functions... +template <typename T, size_t bits> +struct SkBarriers { + static T AcquireLoad(T*); + static void ReleaseStore(T*, T); +}; + +#define SK_BARRIERS(BITS) \ + template <typename T> \ + struct SkBarriers<T, BITS> { \ + static T AcquireLoad(T* ptr) { \ + return (T)__tsan_atomic ## BITS ## _load((__tsan_atomic ## BITS*)ptr, \ + __tsan_memory_order_acquire); \ + } \ + static void ReleaseStore(T* ptr, T val) { \ + __tsan_atomic ## BITS ## _store((__tsan_atomic ## BITS*)ptr, \ + val, \ + __tsan_memory_order_release); \ + } \ + } +SK_BARRIERS(8); +SK_BARRIERS(16); +SK_BARRIERS(32); +SK_BARRIERS(64); +#undef SK_BARRIERS + +template <typename T> +T sk_acquire_load(T* ptr) { return SkBarriers<T, 8*sizeof(T)>::AcquireLoad(ptr); } + +template <typename T> +void sk_release_store(T* ptr, T val) { SkBarriers<T, 8*sizeof(T)>::ReleaseStore(ptr, val); } + + +#endif//SkBarriers_tsan_DEFINED |