#pragma once #include #include "container/seadBuffer.h" #include "framework/seadInfLoopChecker.h" #include "heap/seadDisposer.h" #include "hostio/seadHostIONode.h" #include "mc/seadCoreInfo.h" #include "mc/seadJobQueue.h" #include "mc/seadWorker.h" #include "time/seadTickSpan.h" #include "time/seadTickTime.h" namespace sead { class WorkerMgr : public hostio::Node { public: struct InitializeArg { InitializeArg(); std::array thread_priorities; std::array thread_stack_sizes; u32 worker_num_jobs; const char* name; }; WorkerMgr(); virtual ~WorkerMgr() = default; WorkerMgr(const WorkerMgr&) = delete; auto operator=(const WorkerMgr&) = delete; virtual void initialize(const InitializeArg& arg); void finalize(); void pushJobQueue(JobQueue* queue, CoreIdMask core_id_mask, SyncType sync_type, JobQueuePushType push_type); void pushJobQueue(const char* context_name, JobQueue* queue, CoreIdMask core_id_mask, SyncType sync_type, JobQueuePushType push_type); void run(); void sync(); bool isAllWorkerSleep() const; protected: void onInfLoop_(const InfLoopChecker::InfLoopParam& param); InfLoopChecker::InfLoopEvent::Slot mInfLoopEventSlot; Buffer mWorkers; Buffer mJobQueues; u32 mNumJobQueues; bool mProcessJobQueues = false; u32 mNumWakeups = 0; TickTime mLastWakeup; TickSpan mWaitDuration = TickSpan::makeFromMilliSeconds(1); }; } // namespace sead