1 // Copyright 2014 Dolphin Emulator Project
2 // Licensed under GPLv2+
3 // Refer to the license.txt file included.
4
5 #include <gtest/gtest.h>
6 #include <thread>
7
8 #include "Common/SPSCQueue.h"
9
TEST(SPSCQueue,Simple)10 TEST(SPSCQueue, Simple)
11 {
12 Common::SPSCQueue<u32> q;
13
14 EXPECT_EQ(0u, q.Size());
15 EXPECT_TRUE(q.Empty());
16
17 q.Push(1);
18 EXPECT_EQ(1u, q.Size());
19 EXPECT_FALSE(q.Empty());
20
21 u32 v;
22 q.Pop(v);
23 EXPECT_EQ(1u, v);
24 EXPECT_EQ(0u, q.Size());
25 EXPECT_TRUE(q.Empty());
26
27 // Test the FIFO order.
28 for (u32 i = 0; i < 1000; ++i)
29 q.Push(i);
30 EXPECT_EQ(1000u, q.Size());
31 for (u32 i = 0; i < 1000; ++i)
32 {
33 u32 v2;
34 q.Pop(v2);
35 EXPECT_EQ(i, v2);
36 }
37 EXPECT_TRUE(q.Empty());
38
39 for (u32 i = 0; i < 1000; ++i)
40 q.Push(i);
41 EXPECT_FALSE(q.Empty());
42 q.Clear();
43 EXPECT_TRUE(q.Empty());
44 }
45
TEST(SPSCQueue,MultiThreaded)46 TEST(SPSCQueue, MultiThreaded)
47 {
48 Common::SPSCQueue<u32> q;
49
50 auto inserter = [&q]() {
51 for (u32 i = 0; i < 100000; ++i)
52 q.Push(i);
53 };
54
55 auto popper = [&q]() {
56 for (u32 i = 0; i < 100000; ++i)
57 {
58 while (q.Empty())
59 ;
60 u32 v;
61 q.Pop(v);
62 EXPECT_EQ(i, v);
63 }
64 };
65
66 std::thread popper_thread(popper);
67 std::thread inserter_thread(inserter);
68
69 popper_thread.join();
70 inserter_thread.join();
71 }
72