// Copyright (C) 2014 Jérôme Leclercq // This file is part of the "Nazara Engine - Core module" // For conditions of distribution and use, see copyright notice in Config.hpp #include #include #include #if defined(NAZARA_PLATFORM_WINDOWS) #include #elif defined(NAZARA_PLATFORM_POSIX) #include #else #error Lack of implementation: Task Scheduler #endif #include namespace { std::vector s_pendingWorks; unsigned int s_workerCount = 0; } unsigned int NzTaskScheduler::GetWorkerCount() { return (s_workerCount > 0) ? s_workerCount : NzHardwareInfo::GetProcessorCount(); } bool NzTaskScheduler::Initialize() { return NzTaskSchedulerImpl::Initialize(GetWorkerCount()); } void NzTaskScheduler::Run() { if (!Initialize()) NazaraError("Failed to initialize TaskScheduler"); if (!s_pendingWorks.empty()) { NzTaskSchedulerImpl::Run(&s_pendingWorks[0], s_pendingWorks.size()); s_pendingWorks.clear(); } } void NzTaskScheduler::SetWorkerCount(unsigned int workerCount) { #ifdef NAZARA_CORE_SAFE if (NzTaskSchedulerImpl::IsInitialized()) { NazaraError("Worker count cannot be set while initialized"); return; } #endif s_workerCount = workerCount; } void NzTaskScheduler::Uninitialize() { if (NzTaskSchedulerImpl::IsInitialized()) NzTaskSchedulerImpl::Uninitialize(); } void NzTaskScheduler::WaitForTasks() { if (!Initialize()) NazaraError("Failed to initialize TaskScheduler"); NzTaskSchedulerImpl::WaitForTasks(); } void NzTaskScheduler::AddTaskFunctor(NzFunctor* taskFunctor) { if (!Initialize()) NazaraError("Failed to initialize TaskScheduler"); s_pendingWorks.push_back(taskFunctor); }