29#define CACHE_LINE_SIZE 64
33#pragma warning(disable: 4324)
34#pragma warning(disable: 4820)
35#pragma warning(disable: 4127)
40template<
typename T,
size_t MAX_BLOCK_SIZE = 512>
80 largestBlockSize = ceilToPow2(
maxSize + 1);
91 auto block = make_block(largestBlockSize);
92 if (block ==
nullptr) {
93 throw std::bad_alloc();
108 throw std::bad_alloc();
135 auto element =
reinterpret_cast<T*
>(block->data +
i *
sizeof(T));
189 ReentrantGuard
guard(this->dequeuing);
288 ReentrantGuard
guard(this->dequeuing);
330 ReentrantGuard
guard(this->dequeuing);
404 block = block->next.
load();
411 enum AllocationMode { CanAlloc, CannotAlloc };
413 template<AllocationMode canAlloc,
typename U>
417 ReentrantGuard
guard(this->enqueuing);
502 assert(
false &&
"Should be unreachable code");
526 for (
size_t i = 1;
i <
sizeof(
size_t);
i <<= 1) {
536 const std::size_t
alignment = std::alignment_of<U>::value;
541 struct ReentrantGuard
548 throw std::runtime_error(
"ReaderWriterQueue does not support enqueuing or dequeuing elements from other elements' ctors and dtors");
554 ~ReentrantGuard() { inSection =
false; }
557 ReentrantGuard& operator=(ReentrantGuard
const&);
579 const size_t sizeMask;
590 Block& operator=(Block
const&);
597 static Block* make_block(
size_t capacity)
600 auto size =
sizeof(Block) + std::alignment_of<Block>::value - 1;
601 size +=
sizeof(T) * capacity + std::alignment_of<T>::value - 1;
618 size_t largestBlockSize;
627template<
typename T,
size_t MAX_BLOCK_SIZE = 512>
756 ReaderWriterQueue inner;
757 spsc_sema::LightweightSemaphore sema;
#define AE_UNUSED(x)
Definition atomicops.h:41
#define AE_FORCEINLINE
Definition atomicops.h:51
Definition readerwriterqueue.h:629
AE_FORCEINLINE T * peek()
Definition readerwriterqueue.h:723
AE_FORCEINLINE bool enqueue(T const &element)
Definition readerwriterqueue.h:667
AE_FORCEINLINE bool try_enqueue(T &&element)
Definition readerwriterqueue.h:654
AE_FORCEINLINE size_t size_approx() const
Definition readerwriterqueue.h:744
AE_FORCEINLINE bool pop()
Definition readerwriterqueue.h:731
void wait_dequeue(U &result)
Definition readerwriterqueue.h:708
AE_FORCEINLINE bool try_enqueue(T const &element)
Definition readerwriterqueue.h:642
BlockingReaderWriterQueue(size_t maxSize=15)
Definition readerwriterqueue.h:634
bool try_dequeue(U &result)
Definition readerwriterqueue.h:693
AE_FORCEINLINE bool enqueue(T &&element)
Definition readerwriterqueue.h:679
Definition readerwriterqueue.h:42
size_t size_approx() const
Definition readerwriterqueue.h:394
bool pop()
Definition readerwriterqueue.h:327
ReaderWriterQueue(size_t maxSize=15)
Definition readerwriterqueue.h:68
T * peek()
Definition readerwriterqueue.h:285
AE_FORCEINLINE bool try_enqueue(T const &element)
Definition readerwriterqueue.h:151
AE_FORCEINLINE bool enqueue(T const &element)
Definition readerwriterqueue.h:168
AE_FORCEINLINE bool enqueue(T &&element)
Definition readerwriterqueue.h:176
AE_FORCEINLINE bool try_enqueue(T &&element)
Definition readerwriterqueue.h:159
bool try_dequeue(U &result)
Definition readerwriterqueue.h:186
~ReaderWriterQueue()
Definition readerwriterqueue.h:121
bool tryWait()
Definition atomicops.h:536
void wait()
Definition atomicops.h:546
ssize_t availableApprox() const
Definition atomicops.h:563
void signal(ssize_t count=1)
Definition atomicops.h:552
AE_FORCEINLINE T load() const
Definition atomicops.h:293
Definition atomicops.h:68
@ memory_order_acquire
Definition atomicops.h:72
@ memory_order_sync
Definition atomicops.h:79
@ memory_order_release
Definition atomicops.h:73
AE_FORCEINLINE void fence(memory_order order)
Definition atomicops.h:193
AE_FORCEINLINE void compiler_fence(memory_order order)
Definition atomicops.h:181
#define CACHE_LINE_SIZE
Definition readerwriterqueue.h:29
Definition hackrf_sink_c.h:37
void * tail
Definition hackrf_sink_c.h:44