A modded EditSaber for making beat saber maps.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

100 lines
2.2 KiB

  1. #pragma once
  2. #include "WindowsFileUtilityPrivatePCH.h"
  3. #include "WFULambdaRunnable.h"
  4. uint64 WFULambdaRunnable::ThreadNumber = 0;
  5. FQueuedThreadPool* WFULambdaRunnable::ThreadPool = nullptr;
  6. WFULambdaRunnable::WFULambdaRunnable(TFunction< void()> InFunction)
  7. {
  8. FunctionPointer = InFunction;
  9. FString threadStatGroup = FString::Printf(TEXT("FLambdaRunnable%d"), ThreadNumber++);
  10. Thread = NULL;
  11. Thread = FRunnableThread::Create(this, *threadStatGroup, 0, TPri_BelowNormal); //windows default = 8mb for thread, could specify more
  12. }
  13. WFULambdaRunnable::~WFULambdaRunnable()
  14. {
  15. if (Thread == NULL)
  16. {
  17. delete Thread;
  18. Thread = NULL;
  19. }
  20. ThreadPool->Destroy();
  21. }
  22. //Run
  23. uint32 WFULambdaRunnable::Run()
  24. {
  25. if (FunctionPointer)
  26. FunctionPointer();
  27. //UE_LOG(LogClass, Log, TEXT("FLambdaRunnable %d Run complete"), Number);
  28. return 0;
  29. }
  30. void WFULambdaRunnable::Exit()
  31. {
  32. //UE_LOG(LogClass, Log, TEXT("FLambdaRunnable %d Exit"), Number);
  33. //delete ourselves when we're done
  34. delete this;
  35. }
  36. void WFULambdaRunnable::InitThreadPool(int32 NumberOfThreads)
  37. {
  38. if (ThreadPool == nullptr)
  39. {
  40. ThreadPool = FQueuedThreadPool::Allocate();
  41. int32 NumThreadsInThreadPool = NumberOfThreads;
  42. ThreadPool->Create(NumThreadsInThreadPool, 32 * 1024);
  43. }
  44. }
  45. void WFULambdaRunnable::EnsureCompletion()
  46. {
  47. Thread->WaitForCompletion();
  48. }
  49. WFULambdaRunnable* WFULambdaRunnable::RunLambdaOnBackGroundThread(TFunction< void()> InFunction)
  50. {
  51. if (FPlatformProcess::SupportsMultithreading())
  52. {
  53. //UE_LOG(LogClass, Log, TEXT("FLambdaRunnable RunLambdaBackGroundThread"));
  54. return new WFULambdaRunnable(InFunction);
  55. }
  56. return nullptr;
  57. }
  58. IQueuedWork* WFULambdaRunnable::AddLambdaToQueue(TFunction< void()> InFunction)
  59. {
  60. if (ThreadPool == nullptr)
  61. {
  62. WFULambdaRunnable::InitThreadPool(FPlatformMisc::NumberOfIOWorkerThreadsToSpawn());
  63. }
  64. if (ThreadPool)
  65. {
  66. return AsyncLambdaPool(*ThreadPool, InFunction);
  67. }
  68. return nullptr;
  69. }
  70. bool WFULambdaRunnable::RemoveLambdaFromQueue(IQueuedWork* Work)
  71. {
  72. if (ThreadPool)
  73. {
  74. return ThreadPool->RetractQueuedWork(Work);
  75. }
  76. return false;
  77. }
  78. FGraphEventRef WFULambdaRunnable::RunShortLambdaOnGameThread(TFunction< void()> InFunction)
  79. {
  80. return FFunctionGraphTask::CreateAndDispatchWhenReady(InFunction, TStatId(), nullptr, ENamedThreads::GameThread);
  81. }