/* Copyright 2003-2006 ROBLOX Corporation, All Rights Reserved */ #include "stdafx.h" #include "V8DataModel/DataModelJob.h" #include "rbx/Debug.h" #include "boost/cast.hpp" #include "reflection/enumconverter.h" #include "util/Object.h" #include "rbx/Profiler.h" using namespace RBX; namespace RBX { namespace Reflection { template<> Reflection::EnumDesc::EnumDesc() :Reflection::EnumDescriptor("ConcurrencyModel") { addPair(DataModelArbiter::Serial, "Serial"); addPair(DataModelArbiter::Safe, "Safe"); addPair(DataModelArbiter::Logical, "Logical"); addPair(DataModelArbiter::Empirical, "Empirical"); } } } DataModelJob::DataModelJob(const char* name, TaskType taskType, bool isPerPlayer, shared_ptr arbiter, Time::Interval stepBudget) :Job(name, arbiter, stepBudget) ,taskType(taskType) ,stepsAccumulated(0) ,isPerPlayer(isPerPlayer) ,profilingToken(0) { RBXASSERT(arbiter); #ifdef RBXPROFILER profilingToken = Profiler::getToken("Jobs", name); #endif } TaskScheduler::StepResult DataModelJob::step(const Stats& stats) { #ifdef RBXPROFILER Profiler::Scope profilingScope(profilingToken); #endif return stepDataModelJob(stats); } double DataModelJob::updateStepsRequiredForCyclicExecutive(float stepDt, float desiredHz, float maxStepsPerCycle, float maxStepsAccumulated) { float desiredStepsFloat = stepDt * desiredHz + stepsAccumulated; float desiredStepsFloor = ::floorf( desiredStepsFloat ); desiredStepsFloor = std::min(desiredStepsFloor, maxStepsPerCycle); stepsAccumulated = desiredStepsFloat - desiredStepsFloor; stepsAccumulated = std::min( (float)stepsAccumulated, maxStepsAccumulated); if( desiredStepsFloor <= 0.0f ) { return 0.0f; } return desiredStepsFloor; } double DataModelJob::getPriorityFactor() { //shared_ptr arbiter(shared_polymorphic_downcast(getArbiter())); //if (!arbiter) // return 1; return isPerPlayer ? 1 : std::max(1, getArbiter()->getNumPlayers()); } // The default is "Logical" DataModelArbiter::ConcurrencyModel DataModelArbiter::concurrencyModel = Logical; bool DataModelArbiter::areExclusive(TaskScheduler::Job * job1, TaskScheduler::Job * job2) { DataModelJob* j1 = boost::polymorphic_downcast(job1); DataModelJob* j2 = boost::polymorphic_downcast(job2); return areExclusive(j1->taskType, j2->taskType); } bool DataModelArbiter::areExclusive(DataModelJob::TaskType function1, DataModelJob::TaskType function2) { return lookup[concurrencyModel][function1][function2]; } void static copy(bool src[DataModelJob::TaskTypeCount][DataModelJob::TaskTypeCount], bool dst[DataModelJob::TaskTypeCount][DataModelJob::TaskTypeCount]) { for (int j=0; j