2023-06-26 19:04:16 -04:00
// Copyright Epic Games, Inc. All Rights Reserved.
# include "TelemetryRouter.h"
# include "TelemetryUtils.h"
# include "Misc/ScopeRWLock.h"
2023-11-28 12:20:24 -05:00
# if DO_CHECK
thread_local bool TelemetryRouterReentrancyGuard = false ;
# endif
void FTelemetryRouter : : CheckNotReentrant ( )
{
check ( TelemetryRouterReentrancyGuard = = 0 ) ;
}
2023-06-26 19:04:16 -04:00
FTelemetryRouter : : FTelemetryRouter ( )
{
}
FTelemetryRouter : : ~ FTelemetryRouter ( )
{
}
FTelemetryRouter & FTelemetryRouter : : Get ( )
{
return FTelemetryUtils : : GetRouter ( ) ;
}
2023-08-08 14:29:17 -04:00
void FTelemetryRouter : : ProvideTelemetryInternal ( FGuid Key , FMemoryView Data )
2023-06-26 19:04:16 -04:00
{
2023-11-28 12:20:24 -05:00
CheckNotReentrant ( ) ;
2023-07-01 00:23:21 -04:00
FReadScopeLock Lock ( SinkLock ) ;
2023-11-28 12:20:24 -05:00
# if DO_CHECK
TGuardValue Guard ( TelemetryRouterReentrancyGuard , true ) ;
# endif
2023-08-08 14:29:17 -04:00
FSinkSet * Sinks = KeyToSinks . Find ( Key ) ;
2023-06-26 19:04:16 -04:00
if ( Sinks )
{
2023-08-08 14:29:17 -04:00
if ( ! ensureMsgf ( Sinks - > DataSize = = Data . GetSize ( ) , TEXT ( " Size mismatch mismatch with registered telemetry sink for guid %s. % " SIZE_T_X_FMT " vs % " SIZE_T_X_FMT ) ,
* Key . ToString ( ) , Sinks - > DataSize , Data . GetSize ( ) ) )
{
return ;
}
for ( auto It = Sinks - > Delegates . CreateIterator ( ) ; It ; + + It )
2023-06-26 19:04:16 -04:00
{
bool bStillBound = It - > Value ( Data ) ;
if ( ! bStillBound )
{
It . RemoveCurrent ( ) ;
}
}
}
}
2023-08-08 14:29:17 -04:00
void FTelemetryRouter : : RegisterTelemetrySinkInternal ( FGuid Key , SIZE_T Size , FDelegateHandle InHandle , TFunction < bool ( FMemoryView ) > Sink )
2023-06-26 19:04:16 -04:00
{
2023-11-28 12:20:24 -05:00
CheckNotReentrant ( ) ;
2023-06-26 19:04:16 -04:00
FWriteScopeLock Lock ( SinkLock ) ;
2023-11-28 12:20:24 -05:00
# if DO_CHECK
TGuardValue Guard ( TelemetryRouterReentrancyGuard , true ) ;
# endif
2023-08-08 14:29:17 -04:00
FTelemetryRouter : : FSinkSet * Sinks = KeyToSinks . Find ( Key ) ;
if ( ! Sinks )
{
Sinks = & KeyToSinks . Add ( Key , FSinkSet ( Size ) ) ;
}
if ( ! ensureMsgf ( Sinks - > DataSize = = Size , TEXT ( " Size mismatch mismatch with registered telemetry sink for guid %s. % " SIZE_T_X_FMT " vs % " SIZE_T_X_FMT ) ,
* Key . ToString ( ) , Sinks - > DataSize , Size ) )
{
return ;
}
Sinks - > Delegates . Add ( InHandle , MoveTemp ( Sink ) ) ;
2023-06-26 19:04:16 -04:00
}
void FTelemetryRouter : : UnregisterTelemetrySinkInternal ( FGuid Key , FDelegateHandle InHandle )
{
2023-11-28 12:20:24 -05:00
CheckNotReentrant ( ) ;
2023-06-26 19:04:16 -04:00
FWriteScopeLock Lock ( SinkLock ) ;
2023-11-28 12:20:24 -05:00
# if DO_CHECK
TGuardValue Guard ( TelemetryRouterReentrancyGuard , true ) ;
# endif
2023-08-08 14:29:17 -04:00
FTelemetryRouter : : FSinkSet * Sinks = KeyToSinks . Find ( Key ) ;
2023-06-26 19:04:16 -04:00
if ( Sinks )
{
2023-08-08 14:29:17 -04:00
Sinks - > Delegates . Remove ( InHandle ) ;
2023-06-26 19:04:16 -04:00
}
}