UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
ThreadSingleton.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"
7#include "HAL/PlatformTLS.h"
9
10template <typename FuncType> class TFunctionRef;
11
16{
17public:
18
22 static CORE_API FTlsAutoCleanup* Get( TFunctionRef<FTlsAutoCleanup*()> CreateInstance, uint32& TlsSlot );
23
27 static CORE_API FTlsAutoCleanup* TryGet(uint32& TlsSlot);
28
33};
34
35#define UE_DECLARE_THREAD_SINGLETON_TLS(Type, Api) template<> Api uint32& TThreadSingleton<Type>::GetTlsSlot();
36#define UE_DEFINE_THREAD_SINGLETON_TLS(Type, Api) template<> Api uint32& TThreadSingleton<Type>::GetTlsSlot() { static uint32 TlsSlot = FPlatformTLS::InvalidTlsSlot; return TlsSlot; }
37
42template < class T >
44{
45#if PLATFORM_UNIX || PLATFORM_APPLE
49 CORE_API static uint32& GetTlsSlot()
50 {
51 static uint32 TlsSlot = FPlatformTLS::InvalidTlsSlot;
52 return TlsSlot;
53 }
54#else
58#if PLATFORM_CONSOLE_DYNAMIC_LINK
60#endif
61 static uint32& GetTlsSlot()
62 {
63 static uint32 TlsSlot = FPlatformTLS::InvalidTlsSlot;
64 return TlsSlot;
65 }
66#endif
67
68protected:
69
72 : ThreadId(FPlatformTLS::GetCurrentThreadId())
73 {}
74
76 {
77 // Clean the dangling pointer from the TLS.
78 check(GetTlsSlot() != FPlatformTLS::InvalidTlsSlot);
79 if(((FTlsAutoCleanup*)FPlatformTLS::GetTlsValue(GetTlsSlot())) == static_cast<FTlsAutoCleanup*>(this))
80 {
81 FPlatformTLS::SetTlsValue(GetTlsSlot(), nullptr);
82 }
83 }
84
89 {
90 return new T();
91 }
92
95
96public:
97
101 FORCEINLINE static T& Get()
102 {
103 return *(T*)FThreadSingletonInitializer::Get( [](){ return (FTlsAutoCleanup*)new T(); }, T::GetTlsSlot() ); //-V572
104 }
105
111 {
112 return *(T*)FThreadSingletonInitializer::Get(CreateInstance, T::GetTlsSlot()); //-V572
113 }
114
118 FORCEINLINE static T* TryGet()
119 {
120 return (T*)FThreadSingletonInitializer::TryGet( T::GetTlsSlot() );
121 }
122
127 {
128 return (T*)FThreadSingletonInitializer::Inject(Instance, T::GetTlsSlot());
129 }
130};
#define FORCENOINLINE
Definition AndroidPlatform.h:142
#define FORCEINLINE
Definition AndroidPlatform.h:140
#define check(expr)
Definition AssertionMacros.h:314
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition ThreadSingleton.h:16
static CORE_API FTlsAutoCleanup * Get(TFunctionRef< FTlsAutoCleanup *()> CreateInstance, uint32 &TlsSlot)
Definition ThreadingBase.cpp:1481
static CORE_API FTlsAutoCleanup * TryGet(uint32 &TlsSlot)
Definition ThreadingBase.cpp:1515
static CORE_API FTlsAutoCleanup * Inject(FTlsAutoCleanup *Instance, uint32 &TlsSlot)
Definition ThreadingBase.cpp:1526
Definition TlsAutoCleanup.h:12
Definition AssetRegistryState.h:50
Definition ThreadSingleton.h:44
virtual ~TThreadSingleton()
Definition ThreadSingleton.h:75
static FTlsAutoCleanup * CreateInstance()
Definition ThreadSingleton.h:88
static FORCEINLINE T & Get(TFunctionRef< FTlsAutoCleanup *()> CreateInstance)
Definition ThreadSingleton.h:110
const uint32 ThreadId
Definition ThreadSingleton.h:94
static FORCEINLINE T * Inject(T *Instance)
Definition ThreadSingleton.h:126
static FORCEINLINE T * TryGet()
Definition ThreadSingleton.h:118
TThreadSingleton()
Definition ThreadSingleton.h:71
static FORCEINLINE T & Get()
Definition ThreadSingleton.h:101
Definition AndroidPlatformTLS.h:16
static UE_FORCEINLINE_HINT void * GetTlsValue(uint32 SlotIndex)
Definition AndroidPlatformTLS.h:57
static UE_FORCEINLINE_HINT void SetTlsValue(uint32 SlotIndex, void *Value)
Definition AndroidPlatformTLS.h:47
static const uint32 InvalidTlsSlot
Definition GenericPlatformTLS.h:13