// Copyright 2009-2020 Intel Corporation // SPDX-License-Identifier: Apache-2.0 #pragma once #include #include "intrinsics.h" namespace embree { /* compiler memory barriers */ #if defined(__INTEL_COMPILER) //#define __memory_barrier() __memory_barrier() #elif defined(__GNUC__) || defined(__clang__) # define __memory_barrier() asm volatile("" ::: "memory") #elif defined(_MSC_VER) # define __memory_barrier() _ReadWriteBarrier() #endif template struct atomic : public std::atomic { atomic () {} atomic (const T& a) : std::atomic(a) {} atomic (const atomic& a) { this->store(a.load()); } atomic& operator=(const atomic& other) { this->store(other.load()); return *this; } }; template __forceinline void atomic_min(std::atomic& aref, const T& bref) { const T b = bref.load(); while (true) { T a = aref.load(); if (a <= b) break; if (aref.compare_exchange_strong(a,b)) break; } } template __forceinline void atomic_max(std::atomic& aref, const T& bref) { const T b = bref.load(); while (true) { T a = aref.load(); if (a >= b) break; if (aref.compare_exchange_strong(a,b)) break; } } }