citra-emu
/
citra-canary
Archived
1
0
Fork 0

remove polymorphism issue

This commit is contained in:
B3n30 2018-07-21 16:16:21 +02:00
parent fd5f71bcff
commit 8480899d8b
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