35 typedef typename ConcurrentQueue::index_t index_t;
36 typedef typename ConcurrentQueue::size_t size_t;
37 typedef typename std::make_signed<size_t>::type ssize_t;
39 static const size_t BLOCK_SIZE = ConcurrentQueue::BLOCK_SIZE;
40 static const size_t EXPLICIT_BLOCK_EMPTY_COUNTER_THRESHOLD = ConcurrentQueue::EXPLICIT_BLOCK_EMPTY_COUNTER_THRESHOLD;
41 static const size_t EXPLICIT_INITIAL_INDEX_SIZE = ConcurrentQueue::EXPLICIT_INITIAL_INDEX_SIZE;
42 static const size_t IMPLICIT_INITIAL_INDEX_SIZE = ConcurrentQueue::IMPLICIT_INITIAL_INDEX_SIZE;
43 static const size_t INITIAL_IMPLICIT_PRODUCER_HASH_SIZE = ConcurrentQueue::INITIAL_IMPLICIT_PRODUCER_HASH_SIZE;
44 static const std::uint32_t EXPLICIT_CONSUMER_CONSUMPTION_QUOTA_BEFORE_ROTATE = ConcurrentQueue::EXPLICIT_CONSUMER_CONSUMPTION_QUOTA_BEFORE_ROTATE;
45 static const size_t MAX_SUBQUEUE_SIZE = ConcurrentQueue::MAX_SUBQUEUE_SIZE;
63 MOODYCAMEL_THROW(std::bad_alloc());
72 MOODYCAMEL_THROW(std::bad_alloc());
87 : inner(std::move(other.inner)), sema(std::move(other.sema))
92 return swap_internal(other);
102 swap_internal(other);
108 if (
this == &other) {
112 inner.swap(other.inner);
113 sema.swap(other.sema);
123 inline bool enqueue(T
const&
item)
125 if ((details::likely)(inner.enqueue(
item))) {
137 inline bool enqueue(T&&
item)
139 if ((details::likely)(inner.enqueue(std::move(
item)))) {
152 if ((details::likely)(inner.enqueue(token,
item))) {
165 if ((details::likely)(inner.enqueue(token, std::move(
item)))) {
178 template<
typename It>
179 inline bool enqueue_bulk(
It itemFirst,
size_t count)
181 if ((details::likely)(inner.enqueue_bulk(std::forward<It>(
itemFirst), count))) {
182 sema->signal((LightweightSemaphore::ssize_t)(ssize_t)count);
194 template<
typename It>
197 if ((details::likely)(inner.enqueue_bulk(token, std::forward<It>(
itemFirst), count))) {
198 sema->signal((LightweightSemaphore::ssize_t)(ssize_t)count);
209 inline bool try_enqueue(T
const&
item)
211 if (inner.try_enqueue(
item)) {
223 inline bool try_enqueue(T&&
item)
225 if (inner.try_enqueue(std::move(
item))) {
237 if (inner.try_enqueue(token,
item)) {
249 if (inner.try_enqueue(token, std::move(
item))) {
263 template<
typename It>
264 inline bool try_enqueue_bulk(
It itemFirst,
size_t count)
266 if (inner.try_enqueue_bulk(std::forward<It>(
itemFirst), count)) {
267 sema->signal((LightweightSemaphore::ssize_t)(ssize_t)count);
278 template<
typename It>
281 if (inner.try_enqueue_bulk(token, std::forward<It>(
itemFirst), count)) {
282 sema->signal((LightweightSemaphore::ssize_t)(ssize_t)count);
294 inline bool try_dequeue(U&
item)
296 if (sema->tryWait()) {
297 while (!inner.try_dequeue(
item)) {
312 if (sema->tryWait()) {
313 while (!inner.try_dequeue(token,
item)) {
326 template<
typename It>
327 inline size_t try_dequeue_bulk(
It itemFirst,
size_t max)
330 max = (size_t)sema->tryWaitMany((LightweightSemaphore::ssize_t)(ssize_t)max);
331 while (count != max) {
342 template<
typename It>
346 max = (size_t)sema->tryWaitMany((LightweightSemaphore::ssize_t)(ssize_t)max);
347 while (count != max) {
359 inline void wait_dequeue(U&
item)
361 while (!sema->wait()) {
364 while (!inner.try_dequeue(
item)) {
382 while (!inner.try_dequeue(
item)) {
392 template<
typename U,
typename Rep,
typename Period>
393 inline bool wait_dequeue_timed(U&
item, std::chrono::duration<Rep, Period>
const&
timeout)
395 return wait_dequeue_timed(
item, std::chrono::duration_cast<std::chrono::microseconds>(
timeout).count());
404 while (!sema->wait()) {
407 while (!inner.try_dequeue(token,
item)) {
425 while (!inner.try_dequeue(token,
item)) {
435 template<
typename U,
typename Rep,
typename Period>
438 return wait_dequeue_timed(token,
item, std::chrono::duration_cast<std::chrono::microseconds>(
timeout).count());
446 template<
typename It>
447 inline size_t wait_dequeue_bulk(
It itemFirst,
size_t max)
450 max = (size_t)sema->waitMany((LightweightSemaphore::ssize_t)(ssize_t)max);
451 while (count != max) {
464 template<
typename It>
468 max = (size_t)sema->waitMany((LightweightSemaphore::ssize_t)(ssize_t)max,
timeout_usecs);
469 while (count != max) {
480 template<
typename It,
typename Rep,
typename Period>
481 inline size_t wait_dequeue_bulk_timed(
It itemFirst,
size_t max, std::chrono::duration<Rep, Period>
const&
timeout)
491 template<
typename It>
495 max = (size_t)sema->waitMany((LightweightSemaphore::ssize_t)(ssize_t)max);
496 while (count != max) {
509 template<
typename It>
513 max = (size_t)sema->waitMany((LightweightSemaphore::ssize_t)(ssize_t)max,
timeout_usecs);
514 while (count != max) {
525 template<
typename It,
typename Rep,
typename Period>
538 inline size_t size_approx()
const
540 return (
size_t)sema->availableApprox();
547 static bool is_lock_free()
549 return ConcurrentQueue::is_lock_free();
554 template<
typename U,
typename A1,
typename A2>
555 static inline U* create(
A1&&
a1,
A2&&
a2)
557 void* p = (Traits::malloc)(
sizeof(U));
558 return p !=
nullptr ?
new (p) U(std::forward<A1>(
a1), std::forward<A2>(
a2)) :
nullptr;
562 static inline void destroy(U* p)