aboutsummaryrefslogtreecommitdiff
path: root/src/zencore/thread.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/zencore/thread.cpp')
-rw-r--r--src/zencore/thread.cpp13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/zencore/thread.cpp b/src/zencore/thread.cpp
index 149a0d781..cb3aced33 100644
--- a/src/zencore/thread.cpp
+++ b/src/zencore/thread.cpp
@@ -156,6 +156,7 @@ Event::Event()
auto* Inner = new EventInner();
Inner->bSet = bInitialState;
m_EventHandle = Inner;
+ std::atomic_thread_fence(std::memory_order_release);
#endif
}
@@ -170,12 +171,13 @@ Event::Set()
#if ZEN_USE_WINDOWS_EVENTS
SetEvent(m_EventHandle);
#else
- auto* Inner = (EventInner*)m_EventHandle;
+ std::atomic_thread_fence(std::memory_order_acquire);
+ auto* Inner = (EventInner*)m_EventHandle;
{
std::unique_lock Lock(Inner->Mutex);
Inner->bSet.store(true);
+ Inner->CondVar.notify_all();
}
- Inner->CondVar.notify_all();
#endif
}
@@ -185,6 +187,7 @@ Event::Reset()
#if ZEN_USE_WINDOWS_EVENTS
ResetEvent(m_EventHandle);
#else
+ std::atomic_thread_fence(std::memory_order_acquire);
auto* Inner = (EventInner*)m_EventHandle;
{
std::unique_lock Lock(Inner->Mutex);
@@ -198,15 +201,18 @@ Event::Close()
{
#if ZEN_USE_WINDOWS_EVENTS
CloseHandle(m_EventHandle);
+ m_EventHandle = nullptr;
#else
+ std::atomic_thread_fence(std::memory_order_acquire);
auto* Inner = (EventInner*)m_EventHandle;
{
std::unique_lock Lock(Inner->Mutex);
Inner->bSet.store(true);
}
+ m_EventHandle = nullptr;
+ std::atomic_thread_fence(std::memory_order_release);
delete Inner;
#endif
- m_EventHandle = nullptr;
}
bool
@@ -226,6 +232,7 @@ Event::Wait(int TimeoutMs)
return (Result == WAIT_OBJECT_0);
#else
+ std::atomic_thread_fence(std::memory_order_acquire);
auto* Inner = reinterpret_cast<EventInner*>(m_EventHandle);
if (Inner->bSet.load())