// Copyright Epic Games, Inc. All Rights Reserved. #include "functionrunner.h" #if ZEN_WITH_COMPUTE_SERVICES # include # include # include # include namespace zen::compute { FunctionRunner::FunctionRunner(std::filesystem::path BasePath) : m_ActionsPath(BasePath / "actions") { } FunctionRunner::~FunctionRunner() = default; size_t FunctionRunner::QueryCapacity() { return 1; } std::vector FunctionRunner::SubmitActions(const std::vector>& Actions) { std::vector Results; Results.reserve(Actions.size()); for (const Ref& Action : Actions) { Results.push_back(SubmitAction(Action)); } return Results; } void FunctionRunner::MaybeDumpAction(int ActionLsn, const CbObject& ActionObject) { if (m_DumpActions) { std::string UniqueId = fmt::format("{}.ddb", ActionLsn); std::filesystem::path Path = m_ActionsPath / UniqueId; zen::WriteFile(Path, IoBuffer(ActionObject.GetBuffer().AsIoBuffer())); } } ////////////////////////////////////////////////////////////////////////// RunnerAction::RunnerAction(FunctionServiceSession* OwnerSession) : m_OwnerSession(OwnerSession) { this->Timestamps[static_cast(State::New)] = DateTime::Now().GetTicks(); } RunnerAction::~RunnerAction() { } void RunnerAction::SetActionState(State NewState) { ZEN_ASSERT(NewState < State::_Count); this->Timestamps[static_cast(NewState)] = DateTime::Now().GetTicks(); do { if (State CurrentState = m_ActionState.load(); CurrentState == NewState) { // No state change return; } else { if (NewState <= CurrentState) { // Cannot transition to an earlier or same state return; } if (m_ActionState.compare_exchange_strong(CurrentState, NewState)) { // Successful state change m_OwnerSession->PostUpdate(this); return; } } } while (true); } void RunnerAction::SetResult(CbPackage&& Result) { m_Result = std::move(Result); } CbPackage& RunnerAction::GetResult() { ZEN_ASSERT(IsCompleted()); return m_Result; } } // namespace zen::compute #endif // ZEN_WITH_COMPUTE_SERVICES