UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
ScopeRWLock.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"
8
9namespace UE
10{
11
12// RAII-style scope locking of a synchronisation primitive
13// `MutexType` is required to implement `ReadLock` and `ReadUnlock` methods
14// Example:
15// {
16// TReadScopeLock<FRWLock> ScopeLock(RWLock);
17// ...
18// }
19template<typename MutexType>
21{
22public:
24
26 : Mutex(&InMutex)
27 {
28 check(Mutex);
29 Mutex->ReadLock();
30 }
31
33 {
34 ReadUnlock();
35 }
36
38 {
39 if (Mutex)
40 {
41 Mutex->ReadUnlock();
42 Mutex = nullptr;
43 }
44 }
45
46private:
47 MutexType* Mutex;
48};
49
50
51// RAII-style scope locking of a synchronisation primitive
52// `MutexType` is required to implement `WriteLock` and `WriteUnlock` methods
53// Example:
54// {
55// TWriteScopeLock<FRWLock> ScopeLock(RWLock);
56// ...
57// }
58template<typename MutexType>
60{
61public:
63
65 : Mutex(&InMutex)
66 {
67 check(Mutex);
68 Mutex->WriteLock();
69 }
70
72 {
74 }
75
77 {
78 if (Mutex)
79 {
80 Mutex->WriteUnlock();
81 Mutex = nullptr;
82 }
83 }
84
85private:
86 MutexType* Mutex;
87};
88
89} // namespace UE
90
93{
94public:
96 : Lock(InLock)
97 {
98 Lock.ReadLock();
99 }
100
102 {
103 Lock.ReadUnlock();
104 }
105
106private:
107 FRWLock& Lock;
108
110};
111
114{
115public:
117 : Lock(InLock)
118 {
119 Lock.WriteLock();
120 }
121
123 {
124 Lock.WriteUnlock();
125 }
126
127private:
128 FRWLock& Lock;
129
131};
132
133//
134// A scope lifetime controlled Read or Write lock of referenced mutex object
135//
141
142namespace UE
143{
144
145// RAII-style scope locking of a synchronisation primitive
146// `MutexType` is required to implement `ReadLock` `WriteLock` `ReadUnlock` and `WriteUnlock` methods
147// Example:
148// {
149// TRWScopeLock<FRWLock> ScopeLock(RWLock, SLT_ReadOnly or SLT_Write);
150// ...
151// }
152template<typename MutexType>
154{
155public:
157
159 : Mutex(&InMutex)
160 , LockType(InLockType)
161 {
162 check(Mutex);
163 if (LockType == SLT_ReadOnly)
164 {
165 Mutex->ReadLock();
166 }
167 else
168 {
169 Mutex->WriteLock();
170 }
171 }
172
174 {
175 if (LockType == SLT_ReadOnly)
176 {
177 Mutex->ReadUnlock();
178 }
179 else
180 {
181 Mutex->WriteUnlock();
182 }
183 }
184
185private:
186 MutexType* Mutex;
187 FRWScopeLockType LockType;
188};
189
190} // namespace UE
191
199{
200public:
202 : LockObject(InLockObject)
203 , LockType(InLockType)
204 {
205 if(LockType != SLT_ReadOnly)
206 {
207 LockObject.WriteLock();
208 }
209 else
210 {
211 LockObject.ReadLock();
212 }
213 }
214
215 // NOTE: As the name suggests, this function should be used with caution.
216 // It releases the read lock _before_ acquiring a new write lock. This is not an atomic operation and the caller should
217 // not treat it as such.
218 // E.g. Pointers read from protected data structures prior to this call may be invalid after the function is called.
220 {
221 if(LockType == SLT_ReadOnly)
222 {
223 LockObject.ReadUnlock();
224 LockObject.WriteLock();
225 LockType = SLT_Write;
226 }
227 }
228
230 {
231 if(LockType == SLT_ReadOnly)
232 {
233 LockObject.ReadUnlock();
234 }
235 else
236 {
237 LockObject.WriteUnlock();
238 }
239 }
240
241private:
243
244 FRWLock& LockObject;
245 FRWScopeLockType LockType;
246};
#define check(expr)
Definition AssertionMacros.h:314
#define UE_NONCOPYABLE(TypeName)
Definition CoreMiscDefines.h:457
#define UE_NODISCARD_CTOR
Definition Platform.h:761
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
FRWScopeLockType
Definition ScopeRWLock.h:137
@ SLT_ReadOnly
Definition ScopeRWLock.h:138
@ SLT_Write
Definition ScopeRWLock.h:139
Definition ScopeRWLock.h:199
void ReleaseReadOnlyLockAndAcquireWriteLock_USE_WITH_CAUTION()
Definition ScopeRWLock.h:219
~FRWScopeLock()
Definition ScopeRWLock.h:229
UE_NODISCARD_CTOR FRWScopeLock(FRWLock &InLockObject, FRWScopeLockType InLockType)
Definition ScopeRWLock.h:201
Definition ScopeRWLock.h:93
UE_NODISCARD_CTOR FReadScopeLock(FRWLock &InLock)
Definition ScopeRWLock.h:95
~FReadScopeLock()
Definition ScopeRWLock.h:101
Definition ScopeRWLock.h:114
UE_NODISCARD_CTOR FWriteScopeLock(FRWLock &InLock)
Definition ScopeRWLock.h:116
~FWriteScopeLock()
Definition ScopeRWLock.h:122
Definition CriticalSection.h:14
UE_REWRITE void WriteLock()
Definition CriticalSection.h:21
UE_REWRITE void ReadUnlock()
Definition CriticalSection.h:41
UE_REWRITE void WriteUnlock()
Definition CriticalSection.h:26
UE_REWRITE void ReadLock()
Definition CriticalSection.h:36
Definition ScopeRWLock.h:154
UE_NONCOPYABLE(TRWScopeLock)
UE_NODISCARD_CTOR TRWScopeLock(MutexType &InMutex, FRWScopeLockType InLockType)
Definition ScopeRWLock.h:158
~TRWScopeLock()
Definition ScopeRWLock.h:173
Definition ScopeRWLock.h:21
void ReadUnlock()
Definition ScopeRWLock.h:37
UE_NONCOPYABLE(TReadScopeLock)
UE_NODISCARD_CTOR TReadScopeLock(MutexType &InMutex)
Definition ScopeRWLock.h:25
~TReadScopeLock()
Definition ScopeRWLock.h:32
Definition ScopeRWLock.h:60
UE_NODISCARD_CTOR TWriteScopeLock(MutexType &InMutex)
Definition ScopeRWLock.h:64
void WriteUnlock()
Definition ScopeRWLock.h:76
~TWriteScopeLock()
Definition ScopeRWLock.h:71
UE_NONCOPYABLE(TWriteScopeLock)
Definition AdvancedWidgetsModule.cpp:13