Work around missing std::hardware_destructive_interference_size.

Use new CPPCORO_CPU_CACHE_LINE instead.

Clang/libc++ doesn't define this symbol so just use a constant
on platforms other than MSVC.
This commit is contained in:
Lewis Baker 2018-10-22 22:31:01 -07:00
parent e25d12f06e
commit f8a4c5ed8a
4 changed files with 14 additions and 5 deletions

View file

@ -143,4 +143,11 @@
# define CPPCORO_CPU_64BIT 0
#endif
#if CPPCORO_COMPILER_MSVC
# define CPPCORO_CPU_CACHE_LINE std::hardware_destructive_interference_size
#else
// On most architectures we can assume a 64-byte cache line.
# define CPPCORO_CPU_CACHE_LINE 64
#endif
#endif

View file

@ -5,6 +5,7 @@
#ifndef CPPCORO_MULTI_PRODUCER_SEQUENCER_HPP_INCLUDED
#define CPPCORO_MULTI_PRODUCER_SEQUENCER_HPP_INCLUDED
#include <cppcoro/config.hpp>
#include <cppcoro/sequence_barrier.hpp>
#include <cppcoro/sequence_range.hpp>
#include <cppcoro/sequence_traits.hpp>
@ -84,10 +85,10 @@ namespace cppcoro
const std::size_t m_sequenceMask;
const std::unique_ptr<std::atomic<SEQUENCE>[]> m_published;
alignas(std::hardware_destructive_interference_size)
alignas(CPPCORO_CPU_CACHE_LINE)
std::atomic<SEQUENCE> m_nextToClaim;
alignas(std::hardware_destructive_interference_size)
alignas(CPPCORO_CPU_CACHE_LINE)
mutable std::atomic<multi_producer_sequencer_wait_operation<SEQUENCE, TRAITS>*> m_awaiters;
#if CPPCORO_COMPILER_MSVC

View file

@ -115,11 +115,11 @@ namespace cppcoro
#endif
// First cache-line is written to by the producer only
alignas(std::hardware_destructive_interference_size)
alignas(CPPCORO_CPU_CACHE_LINE)
std::atomic<SEQUENCE> m_lastPublished;
// Second cache-line is written to by both the producer and consumers
alignas(std::hardware_destructive_interference_size)
alignas(CPPCORO_CPU_CACHE_LINE)
mutable std::atomic<awaiter_t*> m_awaiters;
#if CPPCORO_COMPILER_MSVC

View file

@ -5,6 +5,7 @@
#ifndef CPPCORO_SINGLE_PRODUCER_SEQUENCER_HPP_INCLUDED
#define CPPCORO_SINGLE_PRODUCER_SEQUENCER_HPP_INCLUDED
#include <cppcoro/config.hpp>
#include <cppcoro/sequence_barrier.hpp>
#include <cppcoro/sequence_range.hpp>
@ -97,7 +98,7 @@ namespace cppcoro
const sequence_barrier<SEQUENCE, TRAITS>& m_consumerBarrier;
const std::size_t m_bufferSize;
alignas(std::hardware_destructive_interference_size)
alignas(CPPCORO_CPU_CACHE_LINE)
SEQUENCE m_nextToClaim;
sequence_barrier<SEQUENCE, TRAITS> m_producerBarrier;