diff options
| author | comex <comexk@gmail.com> | 2015-06-02 20:19:00 -0400 |
|---|---|---|
| committer | comex <comexk@gmail.com> | 2015-06-02 20:19:00 -0400 |
| commit | 0c5aa5460612464e49c7e2510d64e78759d2c49c (patch) | |
| tree | 78a6a1bfea79b01ed875cf46c7080e9a0fd1f891 /Source/UnitTests/Common/BusyLoopTest.cpp | |
| parent | 00cbc7c7c7d0f6dbd76158ad6d5a3775c9e03d90 (diff) | |
| parent | 9c730b0a1f50b32348b28d14726ad88bbae691d0 (diff) | |
Merge pull request #2470 from degasus/syncgpu
Common: Blocking Loop (extracted from Fifo.cpp)
Diffstat (limited to 'Source/UnitTests/Common/BusyLoopTest.cpp')
| -rw-r--r-- | Source/UnitTests/Common/BusyLoopTest.cpp | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/Source/UnitTests/Common/BusyLoopTest.cpp b/Source/UnitTests/Common/BusyLoopTest.cpp new file mode 100644 index 0000000000..50d11acb31 --- /dev/null +++ b/Source/UnitTests/Common/BusyLoopTest.cpp @@ -0,0 +1,51 @@ +// Copyright 2014 Dolphin Emulator Project +// Licensed under GPLv2+ +// Refer to the license.txt file included. + +#include <atomic> +#include <thread> + +#include <gtest/gtest.h> + +#include "Common/BlockingLoop.h" +#include "Common/Thread.h" + +TEST(BusyLoopTest, MultiThreaded) +{ + Common::BlockingLoop loop; + Common::Event e; + for (int i = 0; i < 100; i++) + { + loop.Prepare(); + std::thread loop_thread( + [&]() { + loop.Run( + [&]() { + e.Set(); + }); + }); + + // Ping - Pong + for (int j = 0; j < 10; j++) + { + loop.Wakeup(); + e.Wait(); + + // Just waste some time. So the main loop did fall back to the sleep state much more likely. + Common::SleepCurrentThread(1); + } + + for (int j = 0; j < 100; j++) + { + // We normally have to call Wakeup to assure the Event is triggered. + // But this check is for an internal feature of the BlockingLoop. + // It's implemented to fall back to a busy loop regulary. + // If we're in the busy loop, the payload (and so the Event) is called all the time. + //loop.Wakeup(); + e.Wait(); + } + + loop.Stop(); + loop_thread.join(); + } +} |
