|
|
- #pragma once
-
- #include "WindowsFileUtilityPrivatePCH.h"
- #include "WFULambdaRunnable.h"
-
- uint64 WFULambdaRunnable::ThreadNumber = 0;
-
- FQueuedThreadPool* WFULambdaRunnable::ThreadPool = nullptr;
-
- WFULambdaRunnable::WFULambdaRunnable(TFunction< void()> InFunction)
- {
- FunctionPointer = InFunction;
-
- FString threadStatGroup = FString::Printf(TEXT("FLambdaRunnable%d"), ThreadNumber++);
- Thread = NULL;
- Thread = FRunnableThread::Create(this, *threadStatGroup, 0, TPri_BelowNormal); //windows default = 8mb for thread, could specify more
- }
-
- WFULambdaRunnable::~WFULambdaRunnable()
- {
- if (Thread == NULL)
- {
- delete Thread;
- Thread = NULL;
- }
-
- ThreadPool->Destroy();
- }
-
- //Run
- uint32 WFULambdaRunnable::Run()
- {
- if (FunctionPointer)
- FunctionPointer();
-
- //UE_LOG(LogClass, Log, TEXT("FLambdaRunnable %d Run complete"), Number);
- return 0;
- }
-
- void WFULambdaRunnable::Exit()
- {
- //UE_LOG(LogClass, Log, TEXT("FLambdaRunnable %d Exit"), Number);
-
- //delete ourselves when we're done
- delete this;
- }
-
- void WFULambdaRunnable::InitThreadPool(int32 NumberOfThreads)
- {
- if (ThreadPool == nullptr)
- {
- ThreadPool = FQueuedThreadPool::Allocate();
- int32 NumThreadsInThreadPool = NumberOfThreads;
- ThreadPool->Create(NumThreadsInThreadPool, 32 * 1024);
- }
- }
-
- void WFULambdaRunnable::EnsureCompletion()
- {
- Thread->WaitForCompletion();
- }
-
- WFULambdaRunnable* WFULambdaRunnable::RunLambdaOnBackGroundThread(TFunction< void()> InFunction)
- {
- if (FPlatformProcess::SupportsMultithreading())
- {
- //UE_LOG(LogClass, Log, TEXT("FLambdaRunnable RunLambdaBackGroundThread"));
- return new WFULambdaRunnable(InFunction);
- }
- return nullptr;
- }
-
- IQueuedWork* WFULambdaRunnable::AddLambdaToQueue(TFunction< void()> InFunction)
- {
- if (ThreadPool == nullptr)
- {
- WFULambdaRunnable::InitThreadPool(FPlatformMisc::NumberOfIOWorkerThreadsToSpawn());
- }
-
- if (ThreadPool)
- {
- return AsyncLambdaPool(*ThreadPool, InFunction);
- }
- return nullptr;
- }
-
- bool WFULambdaRunnable::RemoveLambdaFromQueue(IQueuedWork* Work)
- {
- if (ThreadPool)
- {
- return ThreadPool->RetractQueuedWork(Work);
- }
- return false;
- }
-
- FGraphEventRef WFULambdaRunnable::RunShortLambdaOnGameThread(TFunction< void()> InFunction)
- {
- return FFunctionGraphTask::CreateAndDispatchWhenReady(InFunction, TStatId(), nullptr, ENamedThreads::GameThread);
- }
-
|