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