UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
SharedRecursiveMutex.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreTypes.h"
6#include "Async/SharedLock.h"
7#include <atomic>
8
9#define UE_API CORE_API
10
11namespace UE { class FSharedRecursiveMutex; }
12
13namespace UE::Core::Private
14{
15
17{
18 [[nodiscard]] static bool Owns(const FSharedRecursiveMutex* Mutex);
19 void Push(const FSharedRecursiveMutex* Mutex);
20 void Pop();
21
24};
25
26} // UE::Core::Private
27
28namespace UE
29{
30
40{
41public:
42 constexpr FSharedRecursiveMutex() = default;
43
46
47 [[nodiscard]] inline bool IsLocked() const
48 {
49 return !!(State.load(std::memory_order_relaxed) & LockCountMask);
50 }
51
52 [[nodiscard]] UE_API bool TryLock();
53 UE_API void Lock();
54 UE_API void Unlock();
55
56 [[nodiscard]] inline bool IsLockShared() const
57 {
58 return !!(State.load(std::memory_order_relaxed) & SharedLockCountMask);
59 }
60
61 // Use TSharedLock or TDynamicSharedLock to acquire a shared lock.
65
66private:
67 void LockSlow(uint32 CurrentState, uint32 CurrentThreadId);
69 void WakeWaitingThreads(uint32 CurrentState);
70
71 const void* GetLockAddress() const;
72 const void* GetSharedLockAddress() const;
73
74 static constexpr uint32 MayHaveWaitingLockFlag = 1 << 0;
75 static constexpr uint32 MayHaveWaitingSharedLockFlag = 1 << 1;
76 static constexpr uint32 LockCountShift = 2;
77 static constexpr uint32 LockCountMask = 0x0000'0ffc;
78 static constexpr uint32 SharedLockCountShift = 12;
79 static constexpr uint32 SharedLockCountMask = 0xffff'f000;
80
81 std::atomic<uint32> State = 0;
82 std::atomic<uint32> ThreadId = 0;
83};
84
85template <>
87{
88public:
89 TSharedLock(const TSharedLock&) = delete;
91
93 : Mutex(Lock)
94 {
95 Mutex.LockShared(Link);
96 }
97
98 inline ~TSharedLock()
99 {
100 Mutex.UnlockShared(Link);
101 }
102
103private:
106};
107
108template <>
110{
111public:
113
116
118 : Mutex(&Lock)
119 {
120 Mutex->LockShared(Link);
121 bLocked = true;
122 }
123
125 : Mutex(&Lock)
126 {
127 }
128
130 : Mutex(Other.Mutex)
131 , bLocked(Other.bLocked)
132 {
133 if (bLocked)
134 {
135 Mutex->LockShared(Link);
136 Mutex->UnlockShared(Other.Link);
137 }
138 Other.Mutex = nullptr;
139 Other.bLocked = false;
140 }
141
143 {
144 if (bLocked)
145 {
146 Mutex->UnlockShared(Link);
147 }
148 Mutex = Other.Mutex;
149 bLocked = Other.bLocked;
150 if (bLocked)
151 {
152 Mutex->LockShared(Link);
153 Mutex->UnlockShared(Other.Link);
154 }
155 Other.Mutex = nullptr;
156 Other.bLocked = false;
157 return *this;
158 }
159
161 {
162 if (bLocked)
163 {
164 Mutex->UnlockShared(Link);
165 }
166 }
167
169 {
170 check(!bLocked);
171 check(Mutex);
172 bLocked = Mutex->TryLockShared(Link);
173 return bLocked;
174 }
175
176 void Lock()
177 {
178 check(!bLocked);
179 check(Mutex);
180 Mutex->LockShared(Link);
181 bLocked = true;
182 }
183
184 void Unlock()
185 {
186 check(bLocked);
187 bLocked = false;
188 Mutex->UnlockShared(Link);
189 }
190
191 [[nodiscard]] inline bool OwnsLock() const
192 {
193 return bLocked;
194 }
195
196 inline explicit operator bool() const
197 {
198 return OwnsLock();
199 }
200
201private:
202 FSharedRecursiveMutex* Mutex = nullptr;
204 bool bLocked = false;
205};
206
207} // UE
208
209#undef UE_API
#define check(expr)
Definition AssertionMacros.h:314
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
const bool
Definition NetworkReplayStreaming.h:178
#define UE_API
Definition SColorGradingComponentViewer.h:12
FRWLock Lock
Definition UnversionedPropertySerialization.cpp:921
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition SharedRecursiveMutex.h:40
UE_API bool TryLockShared(Core::Private::FSharedRecursiveMutexLink &Link)
Definition SharedRecursiveMutex.cpp:214
UE_API void LockShared(Core::Private::FSharedRecursiveMutexLink &Link)
Definition SharedRecursiveMutex.cpp:241
FSharedRecursiveMutex & operator=(const FSharedRecursiveMutex &)=delete
constexpr FSharedRecursiveMutex()=default
FSharedRecursiveMutex(const FSharedRecursiveMutex &)=delete
UE_API void UnlockShared(Core::Private::FSharedRecursiveMutexLink &Link)
Definition SharedRecursiveMutex.cpp:315
bool IsLockShared() const
Definition SharedRecursiveMutex.h:56
bool IsLocked() const
Definition SharedRecursiveMutex.h:47
UE_API void Lock()
Definition SharedRecursiveMutex.cpp:108
UE_API void Unlock()
Definition SharedRecursiveMutex.cpp:187
UE_API bool TryLock()
Definition SharedRecursiveMutex.cpp:80
TDynamicSharedLock & operator=(TDynamicSharedLock &&Other)
Definition SharedRecursiveMutex.h:142
bool TryLock()
Definition SharedRecursiveMutex.h:168
TDynamicSharedLock(FSharedRecursiveMutex &Lock, FDeferLock)
Definition SharedRecursiveMutex.h:124
bool OwnsLock() const
Definition SharedRecursiveMutex.h:191
void Unlock()
Definition SharedRecursiveMutex.h:184
TDynamicSharedLock(FSharedRecursiveMutex &Lock)
Definition SharedRecursiveMutex.h:117
void Lock()
Definition SharedRecursiveMutex.h:176
TDynamicSharedLock(TDynamicSharedLock &&Other)
Definition SharedRecursiveMutex.h:129
TDynamicSharedLock(const TDynamicSharedLock &)=delete
TDynamicSharedLock & operator=(const TDynamicSharedLock &)=delete
~TDynamicSharedLock()
Definition SharedRecursiveMutex.h:160
Definition SharedLock.h:51
bool OwnsLock() const
Definition SharedLock.h:131
void Lock()
Definition SharedLock.h:114
TSharedLock(const TSharedLock &)=delete
~TSharedLock()
Definition SharedRecursiveMutex.h:98
TSharedLock(FSharedRecursiveMutex &Lock)
Definition SharedRecursiveMutex.h:92
TSharedLock & operator=(const TSharedLock &)=delete
Definition SharedLock.h:22
implementation
Definition PlayInEditorLoadingScope.h:8
Definition AdvancedWidgetsModule.cpp:13
Definition LockTags.h:12