Index: ps/trunk/source/ps/TaskManager.h =================================================================== --- ps/trunk/source/ps/TaskManager.h +++ ps/trunk/source/ps/TaskManager.h @@ -77,7 +77,7 @@ void DoPushTask(std::function&& task, TaskPriority priority); class Impl; - std::unique_ptr m; + const std::unique_ptr m; }; } // namespace Threading Index: ps/trunk/source/ps/TaskManager.cpp =================================================================== --- ps/trunk/source/ps/TaskManager.cpp +++ ps/trunk/source/ps/TaskManager.cpp @@ -124,7 +124,7 @@ friend class TaskManager; friend class WorkerThread; public: - Impl(TaskManager& backref); + Impl() = default; ~Impl() { ClearQueue(); @@ -149,9 +149,6 @@ template bool PopTask(std::function& taskOut); - // Back reference (keep this first). - TaskManager& m_TaskManager; - std::atomic m_HasWork = false; std::atomic m_HasLowPriorityWork = false; std::mutex m_GlobalMutex; @@ -161,9 +158,6 @@ // Ideally this would be a vector, since it does get iterated, but that requires movable types. std::deque m_Workers; - - // Round-robin counter for GetWorker. - mutable size_t m_RoundRobinIdx = 0; }; TaskManager::TaskManager() : TaskManager(GetDefaultNumberOfWorkers()) @@ -171,19 +165,14 @@ } TaskManager::TaskManager(size_t numberOfWorkers) + : m{std::make_unique()} { - m = std::make_unique(*this); numberOfWorkers = Clamp(numberOfWorkers, MIN_WORKERS, MAX_WORKERS); m->SetupWorkers(numberOfWorkers); } TaskManager::~TaskManager() = default; -TaskManager::Impl::Impl(TaskManager& backref) - : m_TaskManager(backref) -{ -} - void TaskManager::Impl::SetupWorkers(size_t numberOfWorkers) { for (size_t i = 0; i < numberOfWorkers; ++i)