Program Listing for File SyncRealTime.cc#
↰ Return to documentation for file (doxygen_docs/GeneralKModels/SyncRealTime.cc)
#include"Karana/GeneralKModels/SyncRealTime.h"
#include"Karana/KCore/Allocator.h"
#include<cstdlib>
#include<thread>
namespaceKarana::Models{
namespacekd=Karana::Dynamics;
SyncRealTime::SyncRealTime(std::string_viewname,
constkc::ks_ptr<kd::StatePropagator>&sp,
doublert_speed)
:KModel<SyncRealTime>(name,sp)
,_rt_speed(rt_speed)
,_enabled(rt_speed>0){
constchar*dtest_running=std::getenv("DTEST_RUNNING");
if(dtest_running&&*dtest_running){
_enabled=false;
}
};
kc::ks_ptr<SyncRealTime>SyncRealTime::create(std::string_viewname,
constkc::ks_ptr<kd::StatePropagator>&sp,
doublert_speed){
kc::ks_ptr<SyncRealTime>srt=
std::allocate_shared<SyncRealTime>(kc::Allocator<SyncRealTime>{},name,sp,rt_speed);
sp->registerModel(srt);
returnsrt;
}
voidSyncRealTime::preHop(constkm::Ktime&t,constkm::Vec&){
if(!_enabled){
return;
}
_pre_hop_st=t;
_pre_hop_rt=std::chrono::high_resolution_clock::now();
}
voidSyncRealTime::postHop(constkm::Ktime&t,constkm::Vec&){
if(!_enabled){
return;
}
autonow=std::chrono::high_resolution_clock::now();
autosleep_dur=(t-_pre_hop_st)/_rt_speed;
//Thischeckistoavoidweirdbehavioriftheclockchangesmid-hop
if(now>=_pre_hop_rt){
sleep_dur-=now-_pre_hop_rt;
}
std::this_thread::sleep_for(sleep_dur);
}
voidSyncRealTime::_forceEnable(){_enabled=true;}
//DestructorincludedforMacOSbuilds.Musthaveakey-functionout-of-linetoavoiddulpicate
//symbols.
SyncRealTime::~SyncRealTime(){};
}//namespaceKarana::Models