FRunnableThread* FRunnableThread::Create( class FRunnable* InRunnable, const TCHAR* ThreadName, uint32 InStackSize, EThreadPriority InThreadPri, uint64 InThreadAffinityMask) { FRunnableThread* NewThread = NULL; if (FPlatformProcess::SupportsMultithreading()) { check(InRunnable); // Create a new thread object NewThread = FPlatformProcess::CreateRunnableThread(); if (NewThread) { // Call the thread's create method if (NewThread->CreateInternal(InRunnable,ThreadName,InStackSize,InThreadPri,InThreadAffinityMask) == false) { // We failed to start the thread correctly so clean up delete NewThread; NewThread = NULL; } } } else if (InRunnable->GetSingleThreadInterface()) { // Create a fake thread when multithreading is disabled. NewThread = new FFakeThread(); if (NewThread->CreateInternal(InRunnable,ThreadName,InStackSize,InThreadPri) == false) { // We failed to start the thread correctly so clean up delete NewThread; NewThread = NULL; } } if( NewThread ) { FRunnableThread::GetThreadRegistry().Add( NewThread->GetThreadID(), NewThread ); #if STATS FStartupMessages::Get().AddThreadMetadata( FName( *NewThread->GetThreadName() ), NewThread->GetThreadID() ); #endif // STATS } return NewThread; }