diff --git a/src/common-tests/CMakeLists.txt b/src/common-tests/CMakeLists.txt index a7c50bba5..e9ebb3b64 100644 --- a/src/common-tests/CMakeLists.txt +++ b/src/common-tests/CMakeLists.txt @@ -1,4 +1,5 @@ add_executable(common-tests + event_tests.cpp rectangle_tests.cpp ) diff --git a/src/common-tests/common-tests.vcxproj b/src/common-tests/common-tests.vcxproj index 1c261669e..1a5fe26b5 100644 --- a/src/common-tests/common-tests.vcxproj +++ b/src/common-tests/common-tests.vcxproj @@ -44,6 +44,7 @@ + diff --git a/src/common-tests/common-tests.vcxproj.filters b/src/common-tests/common-tests.vcxproj.filters index a10f34cc5..b37bace2d 100644 --- a/src/common-tests/common-tests.vcxproj.filters +++ b/src/common-tests/common-tests.vcxproj.filters @@ -3,5 +3,6 @@ + \ No newline at end of file diff --git a/src/common-tests/event_tests.cpp b/src/common-tests/event_tests.cpp new file mode 100644 index 000000000..c2a91ec60 --- /dev/null +++ b/src/common-tests/event_tests.cpp @@ -0,0 +1,79 @@ +#include "common/event.h" +#include "gtest/gtest.h" +#include +#include +#include + +TEST(Event, InitialStateUnsignaled) +{ + Common::Event e; + ASSERT_FALSE(e.TryWait(1)); +} + +TEST(Event, SignalOnSameThread) +{ + Common::Event e; + e.Signal(); + ASSERT_TRUE(e.TryWait(1)); +} + +TEST(Event, SignalOnSecondThread) +{ + Common::Event e; + + std::thread thr([&e]() { e.Signal(); }); + e.Wait(); + thr.join(); +} + +TEST(Event, SignalOnSecondThreadWithDelay) +{ + Common::Event e; + std::atomic_bool fl{false}; + + std::thread thr([&e, &fl]() { + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + e.Signal(); + fl.store(true); + }); + ASSERT_FALSE(fl.load()); + e.Wait(); + ASSERT_TRUE(fl.load()); + thr.join(); +} + +TEST(Event, ResetAfterSignaling) +{ + Common::Event e; + + e.Signal(); + e.Reset(); + + ASSERT_FALSE(e.TryWait(1)); +} + +TEST(Event, WaitForMultiple) +{ + Common::Event e1, e2; + e1.Signal(); + e2.Signal(); + + Common::Event* events[] = { &e1, &e2 }; + Common::Event::WaitForMultiple(events, countof(events)); +} + +TEST(Event, AutoReset) +{ + Common::Event e(true); + e.Signal(); + ASSERT_TRUE(e.TryWait(1)); + ASSERT_FALSE(e.TryWait(1)); +} + +TEST(Event, NoAutoReset) +{ + Common::Event e(false); + e.Signal(); + ASSERT_TRUE(e.TryWait(1)); + ASSERT_TRUE(e.TryWait(1)); +} \ No newline at end of file diff --git a/src/common/event.cpp b/src/common/event.cpp index aad3b3a81..3984e5161 100644 --- a/src/common/event.cpp +++ b/src/common/event.cpp @@ -50,7 +50,7 @@ void Event::Reset() ResetEvent(reinterpret_cast(m_event_handle)); } -void Event::WaitForMultipleEvents(Event** events, u32 num_events) +void Event::WaitForMultiple(Event** events, u32 num_events) { DebugAssert(num_events > 0); @@ -120,7 +120,7 @@ void Event::Reset() ; } -void Event::WaitForMultipleEvents(Event** events, u32 num_events) +void Event::WaitForMultiple(Event** events, u32 num_events) { DebugAssert(num_events > 0); @@ -130,6 +130,9 @@ void Event::WaitForMultipleEvents(Event** events, u32 num_events) { pd.fd = events[i]->m_pipe_fds[0]; poll(&pd, 1, -1); + + if (events[i]->m_auto_reset) + events[i]->Reset(); } } diff --git a/src/common/event.h b/src/common/event.h index b975ea0c0..e99e3aa5f 100644 --- a/src/common/event.h +++ b/src/common/event.h @@ -14,7 +14,7 @@ public: void Wait(); bool TryWait(u32 timeout_in_ms); - static void WaitForMultipleEvents(Event** events, u32 num_events); + static void WaitForMultiple(Event** events, u32 num_events); private: #ifdef WIN32