UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
ManualResetEvent.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Async/ParkingLot.h"
6#include <atomic>
7
8namespace UE
9{
10
15{
16public:
17 constexpr FManualResetEvent() = default;
18
21
25 inline bool IsNotified() const
26 {
27 return !!(State.load(std::memory_order_acquire) & IsNotifiedFlag);
28 }
29
33 inline void Wait()
34 {
36 }
37
44 inline bool WaitFor(FMonotonicTimeSpan WaitTime)
45 {
46 return WaitTime.IsZero() ? IsNotified() : WaitUntil(FMonotonicTimePoint::Now() + WaitTime);
47 }
48
55 inline bool WaitUntil(FMonotonicTimePoint WaitTime)
56 {
57 for (;;)
58 {
59 uint8 CurrentState = State.load(std::memory_order_acquire);
60 if (CurrentState & IsNotifiedFlag)
61 {
62 return true;
63 }
64 if (!WaitTime.IsInfinity() && WaitTime <= FMonotonicTimePoint::Now())
65 {
66 return false;
67 }
68 if ((CurrentState & MaybeWaitingFlag) ||
69 State.compare_exchange_weak(CurrentState, MaybeWaitingFlag, std::memory_order_acq_rel))
70 {
71 ParkingLot::WaitUntil(&State, [this]
72 {
73 uint8 NewState = State.load(std::memory_order_relaxed);
74 return !(NewState & IsNotifiedFlag) && (NewState & MaybeWaitingFlag);
75 }, nullptr, WaitTime);
76 }
77 }
78 }
79
83 inline void Notify()
84 {
85 const uint8 CurrentState = State.exchange(IsNotifiedFlag, std::memory_order_release);
86 if (!(CurrentState & IsNotifiedFlag) && (CurrentState & MaybeWaitingFlag))
87 {
88 ParkingLot::WakeAll(&State);
89 }
90 }
91
95 inline void Reset()
96 {
97 State.fetch_and(~IsNotifiedFlag, std::memory_order_release);
98 }
99
100private:
101 static constexpr uint8 IsNotifiedFlag = 1 << 0;
102 static constexpr uint8 MaybeWaitingFlag = 1 << 1;
103
104 std::atomic<uint8> State = 0;
105};
106
107} // UE
uint8_t uint8
Definition binka_ue_file_header.h:8
Definition ManualResetEvent.h:15
FManualResetEvent & operator=(const FManualResetEvent &)=delete
FManualResetEvent(const FManualResetEvent &)=delete
constexpr FManualResetEvent()=default
void Notify()
Definition ManualResetEvent.h:83
bool IsNotified() const
Definition ManualResetEvent.h:25
void Reset()
Definition ManualResetEvent.h:95
void Wait()
Definition ManualResetEvent.h:33
bool WaitFor(FMonotonicTimeSpan WaitTime)
Definition ManualResetEvent.h:44
bool WaitUntil(FMonotonicTimePoint WaitTime)
Definition ManualResetEvent.h:55
FWaitState WaitUntil(const void *Address, TFunctionWithContext< bool()> CanWait, TFunctionWithContext< void()> BeforeWait, FMonotonicTimePoint WaitTime)
Definition ParkingLot.h:78
Definition AdvancedWidgetsModule.cpp:13
Definition MonotonicTime.h:74
constexpr bool IsInfinity() const
Definition MonotonicTime.h:93
static UE_API FMonotonicTimePoint Now()
Definition MonotonicTime.cpp:10
static constexpr FMonotonicTimePoint Infinity()
Definition MonotonicTime.h:80
Definition MonotonicTime.h:20
constexpr bool IsZero() const
Definition MonotonicTime.h:40