#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace wfr { namespace scheduling { void JustInTimeScheduler::_notifyWEPUpdate(SchedulerBase::WepMapEntry& wepe, std::set readyToExecute, std::unique_lock& schedulerLock) { for (auto n : readyToExecute) { nodeQueue.insert(n); } auto resourceTypes = resourceManager.getComputingResourceTypes(); std::vector scheduledQueue; for (auto n : nodeQueue) { auto& ai = n->activity.as(); wfs::AtomicActivityImplementation* fastestImpl = nullptr; resource::ComputingResource* fastestRes = nullptr; prediction::ExecutionTimeResult fastestPred; double minEFT = -1; for (auto restype : resourceTypes) { wfs::AtomicActivityImplementation* bestImpl = nullptr; prediction::ExecutionTimeResult bestPred; auto& aat = ai.baseActivity.baseTemplate.as(); for (auto impl : aat.atomicActivityType->getImplementations()) { auto execPred = predictionManager.predictExecutionTime(ai, *impl, *restype); if (execPred.isValid()) { if (!bestImpl || !bestPred.isValid() || execPred.executionTime.getValue() < bestPred.executionTime.getValue()) { bestImpl = impl; bestPred = execPred; } } } for (auto res : restype->getResources()) { auto eft = _getResourceEstimatedAvailableTime(res) + bestPred.executionTime.getValue(); if (minEFT < 0 || eft < minEFT) { minEFT = eft; fastestImpl = bestImpl; fastestRes = res; fastestPred = bestPred; } } } if (fastestImpl) { auto reservation = resourceManager.reserveComputingResource(fastestRes, 1, false); auto sd = std::make_shared(&ai, fastestImpl, wepe.wep, reservation); sd->setPrediction(fastestPred); ai.setInstanceStatus(wfs::ActivityInstanceStatus::Scheduled); scheduledQueue.push_back(n); executeSchedulingDecision(wepe, sd, schedulerLock); } else { //throw exception::wfr_fatal_error("JustInTimeScheduler could not find a suitable implementation."); } } for (auto n : scheduledQueue) { nodeQueue.erase(n); } } } /* namespace scheduling */ } /* namespace wfr */