From b58f8d19ab20c2b4511e3516e69a26a28d4d642c Mon Sep 17 00:00:00 2001 From: Michael M Date: Wed, 23 Aug 2017 16:45:42 -0700 Subject: Rename Common::FifoQueue to Common::SPSCQueue Since all queues are FIFO data structures, the name wasn't informative as to why you'd use it over a normal queue. I originally thought it had something to do with the hardware graphics FIFO. This renames it using the common acronym SPSC, which stands for single-producer single-consumer, and is most commonly used to talk about lock-free data structures, both of which this is. --- Source/UnitTests/Common/SPSCQueueTest.cpp | 71 +++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 Source/UnitTests/Common/SPSCQueueTest.cpp (limited to 'Source/UnitTests/Common/SPSCQueueTest.cpp') diff --git a/Source/UnitTests/Common/SPSCQueueTest.cpp b/Source/UnitTests/Common/SPSCQueueTest.cpp new file mode 100644 index 0000000000..0a4fbfcc1c --- /dev/null +++ b/Source/UnitTests/Common/SPSCQueueTest.cpp @@ -0,0 +1,71 @@ +// Copyright 2014 Dolphin Emulator Project +// Licensed under GPLv2+ +// Refer to the license.txt file included. + +#include +#include + +#include "Common/SPSCQueue.h" + +TEST(SPSCQueue, Simple) +{ + Common::SPSCQueue q; + + EXPECT_EQ(0u, q.Size()); + EXPECT_TRUE(q.Empty()); + + q.Push(1); + EXPECT_EQ(1u, q.Size()); + EXPECT_FALSE(q.Empty()); + + u32 v; + q.Pop(v); + EXPECT_EQ(1u, v); + EXPECT_EQ(0u, q.Size()); + EXPECT_TRUE(q.Empty()); + + // Test the FIFO order. + for (u32 i = 0; i < 1000; ++i) + q.Push(i); + EXPECT_EQ(1000u, q.Size()); + for (u32 i = 0; i < 1000; ++i) + { + u32 v2; + q.Pop(v2); + EXPECT_EQ(i, v2); + } + EXPECT_TRUE(q.Empty()); + + for (u32 i = 0; i < 1000; ++i) + q.Push(i); + EXPECT_FALSE(q.Empty()); + q.Clear(); + EXPECT_TRUE(q.Empty()); +} + +TEST(SPSCQueue, MultiThreaded) +{ + Common::SPSCQueue q; + + auto inserter = [&q]() { + for (u32 i = 0; i < 100000; ++i) + q.Push(i); + }; + + auto popper = [&q]() { + for (u32 i = 0; i < 100000; ++i) + { + while (q.Empty()) + ; + u32 v; + q.Pop(v); + EXPECT_EQ(i, v); + } + }; + + std::thread popper_thread(popper); + std::thread inserter_thread(inserter); + + popper_thread.join(); + inserter_thread.join(); +} -- cgit v1.2.3