1
0
Fork 0

Merge pull request #3973 from B3n30/MPSCQueue

remove polymorphism issue
This commit is contained in:
Weiyi Wang 2018-07-22 22:22:22 +03:00 committed by GitHub
commit 29ddbe4e7b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 30 additions and 2 deletions

View File

@ -33,9 +33,11 @@ public:
bool Empty() const { bool Empty() const {
return !read_ptr->next.load(); return !read_ptr->next.load();
} }
T& Front() const { T& Front() const {
return read_ptr->current; return read_ptr->current;
} }
template <typename Arg> template <typename Arg>
void Push(Arg&& t) { void Push(Arg&& t) {
// create the element, add it to the queue // create the element, add it to the queue
@ -108,15 +110,41 @@ private:
// single reader, multiple writer queue // single reader, multiple writer queue
template <typename T, bool NeedSize = true> template <typename T, bool NeedSize = true>
class MPSCQueue : public SPSCQueue<T, NeedSize> { class MPSCQueue {
public: public:
u32 Size() const {
return spsc_queue.Size();
}
bool Empty() const {
return spsc_queue.Empty();
}
T& Front() const {
return spsc_queue.Front();
}
template <typename Arg> template <typename Arg>
void Push(Arg&& t) { void Push(Arg&& t) {
std::lock_guard<std::mutex> lock(write_lock); std::lock_guard<std::mutex> lock(write_lock);
SPSCQueue<T, NeedSize>::Push(t); spsc_queue.Push(t);
}
void Pop() {
return spsc_queue.Pop();
}
bool Pop(T& t) {
return spsc_queue.Pop(t);
}
// not thread-safe
void Clear() {
spsc_queue.Clear();
} }
private: private:
SPSCQueue<T, NeedSize> spsc_queue;
std::mutex write_lock; std::mutex write_lock;
}; };
} // namespace Common } // namespace Common