diff options
Diffstat (limited to 'Source/UnitTests/Common/FlagTest.cpp')
| -rw-r--r-- | Source/UnitTests/Common/FlagTest.cpp | 131 |
1 files changed, 67 insertions, 64 deletions
diff --git a/Source/UnitTests/Common/FlagTest.cpp b/Source/UnitTests/Common/FlagTest.cpp index 8d43d10791..ae750029f4 100644 --- a/Source/UnitTests/Common/FlagTest.cpp +++ b/Source/UnitTests/Common/FlagTest.cpp @@ -3,8 +3,8 @@ // Refer to the license.txt file included. #include <array> -#include <thread> #include <gtest/gtest.h> +#include <thread> #include "Common/Flag.h" @@ -12,80 +12,83 @@ using Common::Flag; TEST(Flag, Simple) { - Flag f; - EXPECT_FALSE(f.IsSet()); + Flag f; + EXPECT_FALSE(f.IsSet()); - f.Set(); - EXPECT_TRUE(f.IsSet()); + f.Set(); + EXPECT_TRUE(f.IsSet()); - f.Clear(); - EXPECT_FALSE(f.IsSet()); + f.Clear(); + EXPECT_FALSE(f.IsSet()); - f.Set(false); - EXPECT_FALSE(f.IsSet()); + f.Set(false); + EXPECT_FALSE(f.IsSet()); - EXPECT_TRUE(f.TestAndSet()); - EXPECT_TRUE(f.TestAndClear()); + EXPECT_TRUE(f.TestAndSet()); + EXPECT_TRUE(f.TestAndClear()); - Flag f2(true); - EXPECT_TRUE(f2.IsSet()); + Flag f2(true); + EXPECT_TRUE(f2.IsSet()); } TEST(Flag, MultiThreaded) { - Flag f; - int count = 0; - const int ITERATIONS_COUNT = 100000; - - auto setter = [&]() { - for (int i = 0; i < ITERATIONS_COUNT; ++i) - { - while (f.IsSet()); - f.Set(); - } - }; - - auto clearer = [&]() { - for (int i = 0; i < ITERATIONS_COUNT; ++i) - { - while (!f.IsSet()); - count++; - f.Clear(); - } - }; - - std::thread setter_thread(setter); - std::thread clearer_thread(clearer); - - setter_thread.join(); - clearer_thread.join(); - - EXPECT_EQ(ITERATIONS_COUNT, count); + Flag f; + int count = 0; + const int ITERATIONS_COUNT = 100000; + + auto setter = [&]() { + for (int i = 0; i < ITERATIONS_COUNT; ++i) + { + while (f.IsSet()) + ; + f.Set(); + } + }; + + auto clearer = [&]() { + for (int i = 0; i < ITERATIONS_COUNT; ++i) + { + while (!f.IsSet()) + ; + count++; + f.Clear(); + } + }; + + std::thread setter_thread(setter); + std::thread clearer_thread(clearer); + + setter_thread.join(); + clearer_thread.join(); + + EXPECT_EQ(ITERATIONS_COUNT, count); } TEST(Flag, SpinLock) { - // Uses a flag to implement basic spinlocking using TestAndSet. - Flag f; - int count = 0; - const int ITERATIONS_COUNT = 5000; - const int THREADS_COUNT = 50; - - auto adder_func = [&]() { - for (int i = 0; i < ITERATIONS_COUNT; ++i) - { - // Acquire the spinlock. - while (!f.TestAndSet()); - count++; - f.Clear(); - } - }; - - std::array<std::thread, THREADS_COUNT> threads; - for (auto& th : threads) - th = std::thread(adder_func); - for (auto& th : threads) - th.join(); - - EXPECT_EQ(ITERATIONS_COUNT * THREADS_COUNT, count); + // Uses a flag to implement basic spinlocking using TestAndSet. + Flag f; + int count = 0; + const int ITERATIONS_COUNT = 5000; + const int THREADS_COUNT = 50; + + auto adder_func = [&]() { + for (int i = 0; i < ITERATIONS_COUNT; ++i) + { + // Acquire the spinlock. + while (!f.TestAndSet()) + ; + count++; + f.Clear(); + } + }; + + std::array<std::thread, THREADS_COUNT> threads; + for (auto& th : threads) + th = std::thread(adder_func); + for (auto& th : threads) + th.join(); + + EXPECT_EQ(ITERATIONS_COUNT * THREADS_COUNT, count); } |
