X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2FProducerConsumerQueue.h;h=fd9c94a0dc3fd49edda24695cb16323be4580a77;hb=f2d4ac87c2a6c1903e181f4bc76ce6e7b13620c1;hp=98a5088b7d314b5d0bb17ff02389deb7e6ffaeb0;hpb=e9ebf3f43b1cb2034386bfb5daf25db59c781322;p=folly.git diff --git a/folly/ProducerConsumerQueue.h b/folly/ProducerConsumerQueue.h index 98a5088b..fd9c94a0 100644 --- a/folly/ProducerConsumerQueue.h +++ b/folly/ProducerConsumerQueue.h @@ -1,5 +1,5 @@ /* - * Copyright 2016 Facebook, Inc. + * Copyright 2017 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,13 +27,15 @@ #include #include +#include + namespace folly { /* * ProducerConsumerQueue is a one producer and one consumer queue * without locks. */ -template +template struct ProducerConsumerQueue { typedef T value_type; @@ -62,12 +64,12 @@ struct ProducerConsumerQueue { // (No real synchronization needed at destructor time: only one // thread can be doing this.) if (!std::is_trivially_destructible::value) { - size_t read = readIndex_; - size_t end = writeIndex_; - while (read != end) { - records_[read].~T(); - if (++read == size_) { - read = 0; + size_t readIndex = readIndex_; + size_t endIndex = writeIndex_; + while (readIndex != endIndex) { + records_[readIndex].~T(); + if (++readIndex == size_) { + readIndex = 0; } } } @@ -75,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; @@ -165,12 +167,15 @@ struct ProducerConsumerQueue { return ret; } -private: + private: + char pad0_[CacheLocality::kFalseSharingRange]; const uint32_t size_; T* const records_; - std::atomic readIndex_; - 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_)]; }; }