14#define MANAGE_FILE_HANDLES (#)
23 uint32 ReadRequestCount = 0;
24 bool bIsOpenAndAvailableForClosing =
false;
39 if (HandlesCurrentlyInUse.
Increment() > MaxOpenHandles)
64 if (
Handle->bIsOpenAndAvailableForClosing)
84 if (
Handle->ReadRequestCount++ != 0)
89 if (
Handle->bIsOpenAndAvailableForClosing)
96 if (HandlesCurrentlyInUse.
Increment() > MaxOpenHandles)
107 --
Handle->ReadRequestCount;
118 if (--
Handle->ReadRequestCount == 0)
134 while (HandlesCurrentlyInUse.
GetValue() > MaxOpenHandles)
150 FPlatformProcess::SleepNoStats(.1f);
158 Handle->bIsOpenAndAvailableForClosing =
true;
159 if (OpenAndAvailableForClosingTail)
161 Handle->PreviousLink = OpenAndAvailableForClosingTail;
162 check(!OpenAndAvailableForClosingTail->NextLink);
163 OpenAndAvailableForClosingTail->NextLink =
Handle;
167 check(!OpenAndAvailableForClosingHead);
168 OpenAndAvailableForClosingHead =
Handle;
170 OpenAndAvailableForClosingTail =
Handle;
175 if (OpenAndAvailableForClosingHead ==
Handle)
181 Handle->bIsOpenAndAvailableForClosing =
false;
182 if (OpenAndAvailableForClosingTail ==
Handle)
184 check(OpenAndAvailableForClosingHead && OpenAndAvailableForClosingHead !=
Handle &&
Handle->PreviousLink);
185 OpenAndAvailableForClosingTail =
Handle->PreviousLink;
186 OpenAndAvailableForClosingTail->NextLink =
nullptr;
187 Handle->NextLink =
nullptr;
188 Handle->PreviousLink =
nullptr;
194 Handle->NextLink =
nullptr;
195 Handle->PreviousLink =
nullptr;
206 Result->bIsOpenAndAvailableForClosing =
false;
207 OpenAndAvailableForClosingHead =
Result->NextLink;
208 if (!OpenAndAvailableForClosingHead)
210 check(OpenAndAvailableForClosingTail == Result);
211 OpenAndAvailableForClosingTail =
nullptr;
215 check(OpenAndAvailableForClosingHead->PreviousLink == Result);
216 OpenAndAvailableForClosingHead->PreviousLink =
nullptr;
218 Result->NextLink =
nullptr;
219 Result->PreviousLink =
nullptr;
227 int32 MaxOpenHandles = 0;
245 : ETrackingState::Failure;
249 State = ETrackingState::Skip;
255 if (State == ETrackingState::Success)
263 return State != ETrackingState::Failure;
270 enum class ETrackingState :
uint8
#define check(expr)
Definition AssertionMacros.h:314
#define verify(expr)
Definition AssertionMacros.h:319
bool bSuccess
Definition ConvexDecomposition3.cpp:819
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
UE::FPlatformRecursiveMutex FCriticalSection
Definition CriticalSection.h:53
FRWLock Lock
Definition UnversionedPropertySerialization.cpp:921
Definition PlatformFileCommon.h:236
bool IsValid() const
Definition PlatformFileCommon.h:261
FFileHandleRegistryReadTracker(FFileHandleRegistry &InFileRegistry, FRegisteredFileHandle &InHandle, bool bTrackRead=true)
Definition PlatformFileCommon.h:238
~FFileHandleRegistryReadTracker()
Definition PlatformFileCommon.h:253
Definition PlatformFileCommon.h:29
virtual void PlatformCloseFile(FRegisteredFileHandle *)=0
virtual bool PlatformReopenFile(FRegisteredFileHandle *)=0
FRegisteredFileHandle * InitialOpenFile(const TCHAR *Filename)
Definition PlatformFileCommon.h:37
FFileHandleRegistry(int32 InMaxOpenHandles)
Definition PlatformFileCommon.h:31
virtual ~FFileHandleRegistry()=default
void UnTrackAndCloseFile(FRegisteredFileHandle *Handle)
Definition PlatformFileCommon.h:58
virtual FRegisteredFileHandle * PlatformInitialOpenFile(const TCHAR *Filename)=0
bool TrackStartRead(FRegisteredFileHandle *Handle)
Definition PlatformFileCommon.h:79
void TrackEndRead(FRegisteredFileHandle *Handle)
Definition PlatformFileCommon.h:114
Definition PlatformFileCommon.h:17
Definition ScopeLock.h:141
Definition ThreadSafeCounter.h:14
int32 Increment()
Definition ThreadSafeCounter.h:52
int32 Decrement()
Definition ThreadSafeCounter.h:75
int32 GetValue() const
Definition ThreadSafeCounter.h:120
Definition GenericPlatformFile.h:117
UE_STRING_CLASS Result(Forward< LhsType >(Lhs), RhsLen)
Definition String.cpp.inl:732