123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- #pragma once
- #include "Async/TaskGraphInterfaces.h"
- #include "Containers/Queue.h"
- #include "Misc/DateTime.h"
- #include "Misc/QueuedThreadPool.h"
- #include "Wwise/WwiseTask.h"
- #include <atomic>
- struct WWISECONCURRENCY_API FWwiseExecutionQueue
- {
- const TCHAR* const DebugName;
- const EWwiseTaskPriority TaskPriority;
- using FBasicFunction = TUniqueFunction<void()>;
- #define WWISE_EQ_NAME(name) TEXT(name) TEXT(" Execution Queue worker")
-
- FWwiseExecutionQueue(const TCHAR* InDebugName, EWwiseTaskPriority InTaskPriority = EWwiseTaskPriority::Default);
-
- ~FWwiseExecutionQueue();
-
- void Async(const TCHAR* InDebugName, FBasicFunction&& InFunction);
-
- void AsyncAlways(const TCHAR* InDebugName, FBasicFunction&& InFunction);
-
- void AsyncWait(const TCHAR* InDebugName, FBasicFunction&& InFunction);
-
- void Close();
-
- void CloseAndDelete();
- bool IsBeingClosed() const;
- bool IsClosed() const;
- bool IsRunningInThisThread() const;
- struct FOpQueueItem
- {
- #if ENABLE_NAMED_EVENTS
- FOpQueueItem() : DebugName(nullptr), Function([]{}) {}
- FOpQueueItem(const TCHAR* InDebugName, FBasicFunction&& InFunction) :
- DebugName(InDebugName),
- Function(MoveTemp(InFunction))
- {}
- FOpQueueItem(FOpQueueItem&& Rhs) :
- DebugName(Rhs.DebugName),
- Function(MoveTemp(Rhs.Function))
- {
- }
- #else
- FOpQueueItem() : Function([]{}) {}
- FOpQueueItem(const TCHAR*, FBasicFunction&& InFunction) :
- Function(MoveTemp(InFunction))
- {}
- FOpQueueItem(FOpQueueItem&& Rhs) :
- Function(MoveTemp(Rhs.Function))
- {
- }
- #endif
- FOpQueueItem& operator=(const FOpQueueItem& Rhs)
- {
- #if ENABLE_NAMED_EVENTS
- check(Rhs.DebugName == nullptr);
- DebugName = nullptr;
- #endif
- Function = []{};
- return *this;
- }
-
- #if ENABLE_NAMED_EVENTS
- const TCHAR* DebugName;
- #endif
- FBasicFunction Function;
- };
- private:
- class ExecutionQueuePoolTask;
- enum class EWorkerState
- {
- Stopped,
- Running,
- AddOp,
- Closing,
- Closed
- };
- std::atomic<EWorkerState> WorkerState{ EWorkerState::Stopped };
- bool bDeleteOnceClosed{ false };
- using FOpQueue = TQueue<FOpQueueItem, EQueueMode::Mpsc>;
- FOpQueue OpQueue;
- struct TLS;
- void StartWorkerIfNeeded();
- void Work();
- bool KeepWorking();
- void ProcessWork();
- bool TrySetStoppedWorkerToRunning();
- bool TrySetRunningWorkerToStopped();
- bool TrySetRunningWorkerToAddOp();
- bool TrySetAddOpWorkerToRunning();
- bool TrySetRunningWorkerToClosing();
- bool TrySetClosingWorkerToClosed();
- static const TCHAR* StateName(EWorkerState State);
- FORCEINLINE bool TryStateUpdate(EWorkerState NeededState, EWorkerState WantedState);
- private:
- FWwiseExecutionQueue(const FWwiseExecutionQueue& Rhs) = delete;
- FWwiseExecutionQueue(FWwiseExecutionQueue&& Rhs) = delete;
- FWwiseExecutionQueue& operator=(const FWwiseExecutionQueue& Rhs) = delete;
- FWwiseExecutionQueue& operator=(FWwiseExecutionQueue&& Rhs) = delete;
- public:
- struct WWISECONCURRENCY_API Test
- {
- #if defined(WITH_LOW_LEVEL_TESTS) && WITH_LOW_LEVEL_TESTS || defined(WITH_AUTOMATION_TESTS) || (WITH_DEV_AUTOMATION_TESTS || WITH_PERF_AUTOMATION_TESTS)
- #define WWISE_EXECUTIONQUEUE_TEST_CONST
- #else
- #define WWISE_EXECUTIONQUEUE_TEST_CONST const
- #endif
- static const bool bExtremelyVerbose;
- static WWISE_EXECUTIONQUEUE_TEST_CONST bool bMockEngineDeletion;
- static WWISE_EXECUTIONQUEUE_TEST_CONST bool bMockEngineDeleted;
- static WWISE_EXECUTIONQUEUE_TEST_CONST bool bMockSleepOnStateUpdate;
- static WWISE_EXECUTIONQUEUE_TEST_CONST bool bReduceLogVerbosity;
- static bool IsExtremelyVerbose(){ return bExtremelyVerbose && !bReduceLogVerbosity; }
- };
- };
|