1a8928b745a7158a432033a28c49fb0f0450ccf6emtklein/* 2a8928b745a7158a432033a28c49fb0f0450ccf6emtklein * Copyright 2014 Google Inc. 3a8928b745a7158a432033a28c49fb0f0450ccf6emtklein * 4a8928b745a7158a432033a28c49fb0f0450ccf6emtklein * Use of this source code is governed by a BSD-style license that can be 5a8928b745a7158a432033a28c49fb0f0450ccf6emtklein * found in the LICENSE file. 6a8928b745a7158a432033a28c49fb0f0450ccf6emtklein */ 7a8928b745a7158a432033a28c49fb0f0450ccf6emtklein 8a8928b745a7158a432033a28c49fb0f0450ccf6emtklein#ifndef SkBarriers_tsan_DEFINED 9a8928b745a7158a432033a28c49fb0f0450ccf6emtklein#define SkBarriers_tsan_DEFINED 10a8928b745a7158a432033a28c49fb0f0450ccf6emtklein 11a8928b745a7158a432033a28c49fb0f0450ccf6emtkleinstatic inline void sk_compiler_barrier() { asm volatile("" : : : "memory"); } 12a8928b745a7158a432033a28c49fb0f0450ccf6emtklein 13a8928b745a7158a432033a28c49fb0f0450ccf6emtkleintemplate <typename T> 1419cae4fa2cf667acb05d2e5a1bf0a5dab606fe68mtkleinT sk_acquire_load(T* ptr) { 1519cae4fa2cf667acb05d2e5a1bf0a5dab606fe68mtklein SkASSERT(__atomic_always_lock_free(sizeof(T), ptr)); 1619cae4fa2cf667acb05d2e5a1bf0a5dab606fe68mtklein return __atomic_load_n(ptr, __ATOMIC_ACQUIRE); 1719cae4fa2cf667acb05d2e5a1bf0a5dab606fe68mtklein} 18a8928b745a7158a432033a28c49fb0f0450ccf6emtklein 19a8928b745a7158a432033a28c49fb0f0450ccf6emtkleintemplate <typename T> 2019cae4fa2cf667acb05d2e5a1bf0a5dab606fe68mtkleinvoid sk_release_store(T* ptr, T val) { 2119cae4fa2cf667acb05d2e5a1bf0a5dab606fe68mtklein SkASSERT(__atomic_always_lock_free(sizeof(T), ptr)); 2219cae4fa2cf667acb05d2e5a1bf0a5dab606fe68mtklein return __atomic_store_n(ptr, val, __ATOMIC_RELEASE); 2319cae4fa2cf667acb05d2e5a1bf0a5dab606fe68mtklein} 24a8928b745a7158a432033a28c49fb0f0450ccf6emtklein 25a8928b745a7158a432033a28c49fb0f0450ccf6emtklein#endif//SkBarriers_tsan_DEFINED 26