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