diff --git a/.travis.yml b/.travis.yml index ba721464fa..f1ddde4dee 100644 --- a/.travis.yml +++ b/.travis.yml @@ -32,7 +32,7 @@ matrix: - os: osx env: NAME="macos build" sudo: false - osx_image: xcode10 + osx_image: xcode10.2 install: "./.travis/macos/deps.sh" script: "./.travis/macos/build.sh" after_success: "./.travis/macos/upload.sh" diff --git a/src/common/ring_buffer.h b/src/common/ring_buffer.h index 428d3095fa..bb94b898b9 100644 --- a/src/common/ring_buffer.h +++ b/src/common/ring_buffer.h @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include "common/common_types.h" @@ -29,7 +30,7 @@ class RingBuffer { static_assert(capacity < std::numeric_limits::max() / 2 / granularity); static_assert((capacity & (capacity - 1)) == 0, "capacity must be a power of two"); // Ensure lock-free. - static_assert(std::atomic::is_always_lock_free); + static_assert(std::atomic_size_t::is_always_lock_free); public: /// Pushes slots into the ring buffer @@ -100,10 +101,22 @@ public: } private: - // It is important to align the below variables for performance reasons: + // It is important to separate the below atomics for performance reasons: // Having them on the same cache-line would result in false-sharing between them. - alignas(128) std::atomic m_read_index{0}; - alignas(128) std::atomic m_write_index{0}; + // TODO: Remove this ifdef whenever clang and GCC support + // std::hardware_destructive_interference_size. +#if defined(_MSC_VER) && _MSC_VER >= 1911 + static constexpr std::size_t padding_size = + std::hardware_destructive_interference_size - sizeof(std::atomic_size_t); +#else + static constexpr std::size_t padding_size = 128 - sizeof(std::atomic_size_t); +#endif + + std::atomic_size_t m_read_index{0}; + char padding1[padding_size]; + + std::atomic_size_t m_write_index{0}; + char padding2[padding_size]; std::array m_data; };