X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2FProducerConsumerQueue.h;h=16de57d35486a8207fcb1def59c48d59a1360fd3;hb=e89f46cd508ae85a0d0917119f5a73651e9af1b2;hp=12f2bf427c33ce9485ac393d42097f6b1a1a1741;hpb=05ce52289b0ec8f525a92d6d1955301d0b77c0a7;p=folly.git diff --git a/folly/ProducerConsumerQueue.h b/folly/ProducerConsumerQueue.h index 12f2bf42..16de57d3 100644 --- a/folly/ProducerConsumerQueue.h +++ b/folly/ProducerConsumerQueue.h @@ -35,7 +35,7 @@ namespace folly { * ProducerConsumerQueue is a one producer and one consumer queue * without locks. */ -template +template struct ProducerConsumerQueue { typedef T value_type; @@ -77,7 +77,7 @@ struct ProducerConsumerQueue { std::free(records_); } - template + template bool write(Args&&... recordArgs) { auto const currentWrite = writeIndex_.load(std::memory_order_relaxed); auto nextRecord = currentWrite + 1; @@ -167,15 +167,20 @@ struct ProducerConsumerQueue { return ret; } -private: - char pad0_[CacheLocality::kFalseSharingRange]; - const uint32_t size_; - T* const records_; + // maximum number of items in the queue. + size_t capacity() const { + return size_ - 1; + } + + private: + char pad0_[CacheLocality::kFalseSharingRange]; + const uint32_t size_; + T* const records_; - FOLLY_ALIGN_TO_AVOID_FALSE_SHARING std::atomic readIndex_; - FOLLY_ALIGN_TO_AVOID_FALSE_SHARING std::atomic writeIndex_; + FOLLY_ALIGN_TO_AVOID_FALSE_SHARING std::atomic readIndex_; + FOLLY_ALIGN_TO_AVOID_FALSE_SHARING std::atomic writeIndex_; - char pad1_[CacheLocality::kFalseSharingRange - sizeof(writeIndex_)]; + char pad1_[CacheLocality::kFalseSharingRange - sizeof(writeIndex_)]; }; -} +} // namespace folly